1 Introduction

Structured financial reporting is latest and greatest method of exchanging financial data and reports. The use of XBRL is expanding allover the world, and it is becoming the standard method for exchanging structured financial reports.

The objective of this document is to provide the reader with a basic understanding of what XBRL is, what it does, and how it is implemented.

Parts of this material depends heavily, and refers to the XBRL Taxonomy Development Handbook published by XBRL US and publicly available on the their website. As mentioned in the preface of the handbook, it was created as a guide for creating XBRL taxonomies based on XBRL US experience, which makes it a very valuable resource for anyone or organization interested in implementation of XBRL.

2 Outcomes

This material should provide:

  • Basic understanding of XBRL and its components
  • Familiarity with core terminology and what it refers to
  • Basic understanding of Taxonomy and instance document
  • Basic understanding of the process of development of an XBRL taxonomy and structured reporting process
  • Understanding the ecosystem of structured financial reporting and the supporting technologies

3 Why XBRL and what is it exactly?

XBRL stands for eXtensible Business Reporting Language, and it is defined as:

XBRL provides a language in which reporting terms can be authoritatively defined. Those terms can then be used to uniquely represent the contents of financial statements or other kinds of compliance, performance and business reports. XBRL lets reporting information move between organizations rapidly, accurately and digitally.

XBRL can also be described in terms of what it does, in brief, XBRL provides standards for storing and electronic communication of financial information enabling efficient processing, storage, retrieval, analysis and comparison of the information.

The increase in size of data and regulatory requirements derives the need for more efficient and structured methods to handle this data and convert it into a resource rather than a burden.

3.1 How do we collect financial data

Regulatory Reporting

Regulatory Reporting

The methods and processes of financial data collection evolved over time, we started with paper based submissions, then spreadsheets and flat files were used, then electronic submissions through web based portals. XBRL is the next newest thing in this evolution, benefits of XBRL can be summurized as follows:

What XBRL Provides

What XBRL Provides

  • XBRL provides for a stable structure of the data content
  • XBRL separates data content from the form of the submission
  • XBRL Provides for automation, which increases accuracy, cost and time savings

And many more benefits relating to the quality and richness of that data.

3.1.1 Current issues that XBRL addresses

As mentioned, XBRL provides for structured contextually rich machine readable data, which allows for automation, and that address most of the main data issues in general, for regulators and for issuers.

General Issues:

  • Machine Readable: reports with XBRL tagging can be consumed and analyzed by computers through XBRL enabled software (XBRL Processors) as opposed to paper based or unstructured reports.
  • Interoperability: XBRL is self-describing and uses XML syntax which makes the information in XBRL system independent, in other words, the same XBRL information package can be consumed by any system that has XBRL enabled software, which addresses compatibility issues.
  • It provides for a common set of rules that can be used in exchanging any financial information, hence it provides a common language for exchanging data, addressing comparability issues.
  • XBRL provides for automated means of compiling, transmitting, validating and analyzing financial data, which increase efficiency, time and cost saving and at the same time increasing quality of data.
  • XBRL provides high quality, contextually rich financial data rather than fragmented data.
  • XBRL is free and opensource standard, with no licensing fees, addresses issues of propitiatory standards and software, it should be noted that XBRL enabled software is not free.

Regulator Issues:

  • High volumes of data and reports: as mentioned, XBRL provides for automation in collecting and processing data, which facilitates handling high volumes in an accurate and efficient manner.
  • Review and validation: XBRL give financial report a structure that enable creation of validation rules based on regulations, business rules and any other criteria, and that in turn enables quick corrective action to be taken when needed.
  • Data can be stored for cross checking and further analysis and comparison.
  • Single source of the truth, XBRL structure allows data to be used for many purposes, for example, same report can contain data structures required for a regulator, census, taxes …

Issuer Issues:

  • Simplifies the compilation of reports required by multiple regulators from the same dataset.
  • XBRL taxonomies and the related guides issued by regulators provide for clear and unambiguous reporting requirements, and simplifies compliance.
  • Reduces the chance of costly errors.

3.2 Who uses XBRL?

The XBRL Taxonomy Development Handbook in page 6 lists successful implementation of XBRL around the worlds, that includes:

  • United States: Stock exchange commission (SEC), and Financial Depository Insurance Corporation (FDIC) with total reporting entities of over 17,500

  • United Kingdom: Her Majesty’s Revenues & Customs (HMRC), and Companies House with reporting entities of over 2 million

  • Spain: Business Registrar, Banking Regulator, Securities Regulation, Accounting Oversight and State Federal Comptroller with reporting entities of over 800,000

  • Others: Europe (European Single Electronic Format ESEF), India, Singapore, South Korea, Italy, Peru, World bank and many others

  • Governments and government agencies allover the world are using XBRL, countries like Netherlands and Australia implemented Standard Business Reporting (SBR) programs which are programs designed to reduce regulatory burden for businesses and relies heavily on XBRL.

Currently XBRL international website lists more than 20 XBRL jurisdictions (a jurisdiction is a local representative for XBRL acting as the primary liaison to national government, technology firms and business communities)

3.2.1 XBRL Implementations Map

XBRL website presents a map and listing for XBRL implementation projects world wide that can be accessed here

Why XBRL? In short, it addresses most current issues relating to exchange of financial data, it is widely used allover the world, and it is simply the next step in the evolution of financial data exchange systems.

3.3 What is Extensible Business Reporting Language (XBRL)?

The Specifications
Technically XBRL is based on XML (eXtensible Markup Language), it can be said that XBRL is an XML extension optimized to deal with business information. In other words, XBRL does what it does by being based on XML.

XBRL is a set of specifications developed and maintained by XBRL International. The base XBRL specification (now version 2.1) is stable since 2003, with additional specifications being added to augment it such as XBRL Dimensions.

XBRL specification are freely available without licensing, note that this doesn’t apply for XBRL enabled software which might have licensing fees.

Data Model
XBRL specifications are tools that enables the definition of dictionaries, data models and rules called XBRL Taxonomies, also XBRL specifications provide the tools to create structured financial reports based on XBRL Taxonomies, these financial reports are called XBRL Instances.

So we can say that XBRL is the set of tools used to create data models and structures that are the basis for structured financial reporting.

Communication Language
The purpose of XBRL is to enable exchange of structured financial data between systems, some times the term “transport model” is used to refer to XBRL.

“A Transport Model serves as an organizational structure when moving data from a source to a consumer”

Understanding XBRL and how it does what it does, start with XML, in the next section we will go through some of XML concepts that are relevant to understanding XBRL.

3.4 XML and markup languages

3.4.1 Back in time

To explain the most basic concept of markup languages we need to take a trip back in time, to the ancient Egyptian writings.

Cartouche
[Image by Osama Shukir Muhammed Amin FRCP(Glasg), CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0, via Wikimedia Commons]

In the image above, some writing is encapsulated in an oval shape called “Cartouche”, according to the common understanding, this means that the encapsulated writing represents a royal name. The ancient Egyptians choose this method to draw the attention to the information by marking or “tagging” this important information by the oval shape.

Markup languages do the same thing, it is tagging important financial information included in a report, in the case of XBRL, this tagging has consequences when the information is processed by a computer.

Markup languages in general tags the content of a file or a document in a way that makes it machine readable, i.e. when processed by a computer, the tags tell the computer what to do with the content.

Markup languages has different purposes, for example Hyper Text Markup Language (“HTML”) tags tell the computer how to display the content, while few of the main purposes of XML is to store, organize and transport content between systems.

Markup languages are usually system independent, for example all systems have tools to read and parse XML, in other words, an XML file created in a Windows system can be read an parsed by a Linux based system.

3.5 XML Basics

As mentioned XML is a markup language, and it is a set of specifications, rules and tools for describing, storing, and transporting data between systems.

Assume that we want to encode a table of invoices into XML, a fragment of that XML might look as follows:

<table> 


  <invoice CustomerName="abc" InvoiceNum="101">589.91</invoice>


  <invoice CustomerName="xyz" InvoiceNum="101">257.42</invoice>


</table>

3.5.1 XML Form

XML document is composed of elements, each element starts with an opening tag and ends with a closing tag, there can be values or other elements within the opening and closing tags. The XML structure is in the form of a tree, having a root element containing all other elements.

<table> and </table> in the above XML fragment are the opening and closing tags of the root element called table. In the above fragment, the root element has only one child element called invoice. The invoice opening tag contains other information in the form of key, value pairs customerName="abc", invoiceNum=101, these are called attributes, which attaches more information about the element and are usually referred to using the @ symbol, as in @customerName. finally we have a value 589.91 between the invoice opening and closing tag, in this case representing the invoice amount.

To be usable, XML must be well formed XML, a well formed XML has the following:

  • All XML elements must be contained in one root element
  • Each element must have an opening and closing tag
  • Elements must be properly nested
  • Attributes must be quoted

For more about XML well formedness see W3Schools XML Tutorial

3.5.2 Storing Data in XML

Let’s assume we have a table of invoices that we need to store in XML format and send over to another computer, first let’s construct the table:

# Generate a table, same as previous test but 50 rows
set.seed(42)
# Number of rows in the table
table_rows <- 10 
# Customer names
customer_names <- c("abc", "mno","xyz")
# Data frame
tbl_1 <- data.frame(
  CustomerName = sample(customer_names, table_rows, replace = T),
  InvoiceNum = sort(sample(100:999, table_rows)),
  InvoiceDate = sort(sample(seq(as.Date('2000-01-01'), 
                                as.Date('2000-12-31'), 
                                by="day"), table_rows)
                     ),
  InvoiceCurrency = rep("CU",table_rows),
  InvoiceAmt = round(runif(table_rows, min = 100, max = 1000),2), stringsAsFactors = F)

# Display first few rows of the data.frame
head(tbl_1)

Now let’s convert that table to XML format:

# This code converts the invoices table to an XML document 
# and saves it to file

# Create XML root element
xml_root <- xml2::xml_new_root('table')

# Attach each row of the table as an <invoice> element
for(r in asplit(tbl_1,1)) {
  nd <- xml2::xml_add_child(xml_root, 'invoice')
  for(r_n in names(r)){
    xml2::xml_add_child(.x=nd, .value = r_n, r[[r_n]] )
  }
}

# Write the XML document to file
xml_out_tbl_1 <- here::here('xml_files','xml_out.xml')
invisible(xml2::write_xml(xml_root, xml_out_tbl_1))

The resulting XML file looks like this:

<?xml version="1.0" encoding="UTF-8"?>


<table>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>264</InvoiceNum>


    <InvoiceDate>2000-01-05</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>650.60</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>396</InvoiceNum>


    <InvoiceDate>2000-01-24</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>441.60</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>455</InvoiceNum>


    <InvoiceDate>2000-04-18</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>492.19</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>509</InvoiceNum>


    <InvoiceDate>2000-07-30</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>133.69</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>mno</CustomerName>


    <InvoiceNum>631</InvoiceNum>


    <InvoiceDate>2000-09-15</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>976.19</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>mno</CustomerName>


    <InvoiceNum>700</InvoiceNum>


    <InvoiceDate>2000-10-09</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>488.58</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>mno</CustomerName>


    <InvoiceNum>721</InvoiceNum>


    <InvoiceDate>2000-10-24</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>961.82</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>978</InvoiceNum>


    <InvoiceDate>2000-11-09</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>898.98</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>xyz</CustomerName>


    <InvoiceNum>981</InvoiceNum>


    <InvoiceDate>2000-12-13</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>675.98</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>xyz</CustomerName>


    <InvoiceNum>998</InvoiceNum>


    <InvoiceDate>2000-12-25</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>973.87</InvoiceAmt>


  </invoice>


</table>

Examining the resulting XML file, each <invoice> element has 5 child elements each representing a piece of data relating to the invoice, with each of those child elements storing the data as its value. If the focus of this table/report is on the invoice amount <invoiceAmt>, then it might be better to have the invoice amount information as the only value, and everything else might be better represented as an attribute. Attributes usually provide additional contextual information about the element and its value, we may call those attributes aspects or even dimensions. So let’s try to rewrite the XML in a different way to reflect this:

# Re-write the XML file with attributes

# create root element for the new XML
xml_root_2 <- xml2::xml_new_root('table')

# define children with attributes
for(r in asplit(tbl_1,1)) {
  nd <- xml2::xml_add_child(xml_root_2, 'invoice', r[[length(r)]])
  for(r_n in names(r)){
    xml2::xml_attrs(nd) <- r[-length(r)]
  }
}

# Write the XML document to file
xml_out_tbl_2 <- here::here('xml_files','xml_out_2.xml')
invisible(xml2::write_xml(xml_root_2, xml_out_tbl_2))

The resulting New XML file looks like this:

<?xml version="1.0" encoding="UTF-8"?>


<table>


  <invoice CustomerName="abc" InvoiceNum="264" InvoiceDate="2000-01-05" InvoiceCurrency="CU">650.60</invoice>


  <invoice CustomerName="abc" InvoiceNum="396" InvoiceDate="2000-01-24" InvoiceCurrency="CU">441.60</invoice>


  <invoice CustomerName="abc" InvoiceNum="455" InvoiceDate="2000-04-18" InvoiceCurrency="CU">492.19</invoice>


  <invoice CustomerName="abc" InvoiceNum="509" InvoiceDate="2000-07-30" InvoiceCurrency="CU">133.69</invoice>


  <invoice CustomerName="mno" InvoiceNum="631" InvoiceDate="2000-09-15" InvoiceCurrency="CU">976.19</invoice>


  <invoice CustomerName="mno" InvoiceNum="700" InvoiceDate="2000-10-09" InvoiceCurrency="CU">488.58</invoice>


  <invoice CustomerName="mno" InvoiceNum="721" InvoiceDate="2000-10-24" InvoiceCurrency="CU">961.82</invoice>


  <invoice CustomerName="abc" InvoiceNum="978" InvoiceDate="2000-11-09" InvoiceCurrency="CU">898.98</invoice>


  <invoice CustomerName="xyz" InvoiceNum="981" InvoiceDate="2000-12-13" InvoiceCurrency="CU">675.98</invoice>


  <invoice CustomerName="xyz" InvoiceNum="998" InvoiceDate="2000-12-25" InvoiceCurrency="CU">973.87</invoice>


</table>

Now that we have modeled our information in an acceptable form, we can try to re-construct the table from the XML, here I am using R script xml2 library to do that, but it can be done on any system using any language or software capable of parsing XML files:

# Read XML file
xml_tbl <- xml2::read_xml(xml_out_tbl_2)

# find all invoice elements
invoices <- xml2::xml_find_all(xml_tbl, './/invoice')
values <- xml2::xml_find_all(xml_tbl, './/invoice/text()') %>% xml2::as_list() %>% unlist()

# extract invoice attributes and values from all elements and convert to a dataframe
xml_to_tbl <- xml2::xml_attrs(invoices) %>% bind_rows() %>% 
  mutate(InvoiceAmt= as.double(values)) %>% as.data.frame()
# Correct data types
xml_to_tbl$InvoiceNum <- as.integer(xml_to_tbl$InvoiceNum)
xml_to_tbl$InvoiceDate <- as.Date(xml_to_tbl$InvoiceDate)
head(xml_to_tbl)
# Compare result of conversion to original table
paste("Matches Original: ", all_equal(xml_to_tbl, tbl_1)) # Should return TRUE
[1] "Matches Original:  TRUE"

3.5.3 XML Schema, Namespaces and Validation

As mentioned, XML is used to transport information between systems, and now that we have an XML document is created in the previous section, the next step will be to send it to the destination system. But an important question arises, how do we make sure that the destination/receiving system is able to handle and verify the information in our document correctly? For example, the root element in the example document is called table, what should be expected to be included in a table element? Is it a table of invoices, or is it a table a piece of furniture?

To address the above questions, XML has mechanisms whereby elements in an XML document can be described and verified, these is mechanisms mainly depend on schema, namespaces and types.

Schema Is a component of XML (W3C recommendation) used to describe and validate elements in an XML document. Schema can be described as the blueprint of vocabulary used, what and how data is stored in an XML file, and what are the data types of stored data. there are different schema languages such as Document Type Definitions (DTDs), Relax-NG, Schematron and W3C XSD (XML Schema Definitions). The focus will be on XSD as this is the Schema language used in XBRL. XSD being written in XML, it has one root element that contains all the declarations, the root element is <schema> and it is defined as follows:

Namespaces Is a component of XML (W3C recommendation) used for providing uniquely named elements and attributes in an XML document. XML document may contain elements from multiple vocabularies (schema), namespaces help in uniquely identifying elements from different vocabularies having identical names. A namespace takes the form of a URI, for example http://mynamespace.com/1/1. A namespace prefix can be declared in an XML document to refer to specific namespace using @xmlns attribute, for example xmlns:myns=http://mynamespace.com/1/1.

Types and Derivation in xsd
Elements declared in an xsd schema are based on XML built-in data types, or types that are derived from these built-in types. Types in xsd determines the value, content and composition of elements, for example, an element that holds a date value may make use of the built-in type date and may be typed by setting the type attribute type=date. W3C specifications for data types is available here and here. A depiction of built-in datatypes hierarchy from W3C specifications:

Note substitutionGroup: A substitution group is a feature of XML schema that allows you to specify elements that can replace another element in documents generated from that schema. The replaceable element is called the head element and must be defined in the schema’s global scope. The elements of the substitution group must be of the same type as the head element or a type that is derived from the head element’s type.

Given that XML instance can have one and only one root element, this element will inevitably include other elements that have more complicated content than just holding a value of a certain type, and built-in types will not be enough to type these elements. The answer to that is in the X of XML which stands for eXtensible, xsd provides capabilities for creating new types derived from built-in types or other types that are already derived from built-in types. A Summary of type derivation in XSD is as follows:

A useful resource on the topic of XSD data types and derivation is available here.

Following with the invoices table example, a schema was created for this report (using any schema creation software), the schema insures the following:

  • Namespace http://myproject.com/test2/1 was given to refer to the vocabulary of the schema
  • The root element is called table and contains one or more invoice element
  • Each invoice element is required to have a specific set of attributes as follows:
    • @InvoiceNum of data type positive integer
    • @InvoiceDate of data type date
    • @InvoiceCurrency a string that can be either “CU” or “CX”
    • @CustomerName of data type string
    • Finally invoice value must be a positive number or 0

Schema file is as follows:

<?xml version="1.0" encoding="UTF-8"?>


<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"


    xmlns:inv="http://myproject.com/test2/1"


    targetNamespace="http://myproject.com/test2/1"


    elementFormDefault="qualified"


    >


    


    <xs:simpleType name="currType">


        <xs:annotation>


            <xs:documentation>Currency type selection either "CU" or "CX"


            </xs:documentation>


        </xs:annotation>


        <xs:restriction base="xs:string">


            <xs:enumeration value="CU" /> 


            <xs:enumeration value="CX" />


        </xs:restriction>


    </xs:simpleType>


    <xs:attributeGroup name="invoiceGrp">


        <xs:annotation>


            <xs:documentation>Type defining the invoice required information


            </xs:documentation>


        </xs:annotation>


        <xs:attribute name="InvoiceNum" type="xs:unsignedShort"


            use="required" />


        <xs:attribute name="InvoiceDate" type="xs:date"


            use="required" />


        <xs:attribute name="InvoiceCurrency" type="inv:currType"


            use="required" />


        <xs:attribute name="CustomerName" type="xs:string"


            use="required" />


    </xs:attributeGroup>


    <xs:simpleType name="positive_decimalType">


        <xs:annotation>


            <xs:documentation>Restriction on invoice amount to be always a


                positive number.</xs:documentation>


        </xs:annotation>


        <xs:restriction base="xs:decimal">


            <xs:minInclusive value="0" />


        </xs:restriction>


    </xs:simpleType>


    <xs:complexType name="invoiceType">


        <xs:annotation>


            <xs:documentation>Invoice type based using declared positive decimal


                type and invoice attributes group.</xs:documentation>


        </xs:annotation>


        <xs:simpleContent>


            <xs:extension base="inv:positive_decimalType">


                <xs:attributeGroup ref="inv:invoiceGrp" />


            </xs:extension>


        </xs:simpleContent>


    </xs:complexType>


    <xs:element name="table">


        <xs:annotation>


            <xs:documentation>Defines root node using declared invoiceType.


            </xs:documentation>


        </xs:annotation>


        <xs:complexType>


            <xs:sequence>


                <xs:element maxOccurs="unbounded" name="invoice"


                    type="inv:invoiceType" minOccurs="1" />


            </xs:sequence>


        </xs:complexType>


    </xs:element>


</xs:schema>

Now we need to change our XML file to reference the schema, that is done using the @xmlns attribute and giving it a namespace prefix of ‘inv’, and providing the location of the schema file using @xs:schemaLocation attribute, note that the later attribute is from xs=http://www.w3.org/2001/XMLSchema-instance namespace. The new file with the schema reference is named xml_out_2_schema.xml and and the relevant part of it looks as follows:

<inv:table xmlns:inv="http://myproject.com/test2/1" 


    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 


    xs:schemaLocation="http://myproject.com/test2/1 example_2_schema2.xsd">

Validation with no errors
Before processing the XML file, the receiving computer will always validate the XML file against the referenced schema, we can do that here using R script xml2::xml_validate() function as follows:

# Read XML instance and schema
inst <- xml2::read_xml(here::here("xml_files","xml_out_2_schema.xml"))
schema <- xml2::read_xml(here::here("xml_files","example_2_schema2.xsd"))

# Validate XML instance against the schema
xml2::xml_validate(inst,schema)
[1] TRUE
attr(,"errors")
character(0)

Validating the first file returns TRUE with 0 errors, meaning that the file is valid according to the schema.

Validation with Errors
Now let’s change the file and test if the validation will detect the errors. We create a new file called xml_out_2_schema_errors.xml, and we change it to be as follows:

  1. For the first invoice remove @CustomerName attribute -> test missing attributes are detected
  2. For the second invoice change @InvoiceNum value to string ix-> test inconsistent attribute datatype is detected
  3. For the third invoice change @InvoiceCurrency value to XZ -> test only valid currency choices are allowed
  4. in the fourth invoice change the value from 133.69 to -133.69 -> test if only positive invoice amount values are allowed.

Then we run the validation again on the modified file, we should get an error this time:

# Read XML instance and schema",
inst_err <- xml2::read_xml(here::here("xml_files","xml_out_2_schema_errors.xml"))
schema <- xml2::read_xml(here::here("xml_files","example_2_schema2.xsd"))

# Validate XML instance against the schema
xml2::xml_validate(inst_err,schema)
[1] FALSE
attr(,"errors")
[1] "Element '{http://myproject.com/test2/1}invoice': The attribute 'CustomerName' is required but missing."                                                              
[2] "Element '{http://myproject.com/test2/1}invoice', attribute 'InvoiceNum': 'ix' is not a valid value of the atomic type 'xs:unsignedShort'."                           
[3] "Element '{http://myproject.com/test2/1}invoice', attribute 'InvoiceCurrency': [facet 'enumeration'] The value 'XZ' is not an element of the set {'CU', 'CX'}."       
[4] "Element '{http://myproject.com/test2/1}invoice', attribute 'InvoiceCurrency': 'XZ' is not a valid value of the atomic type '{http://myproject.com/test2/1}currType'."
[5] "Element '{http://myproject.com/test2/1}invoice': [facet 'minInclusive'] The value '-133.69' is less than the minimum value allowed ('0')."                           
[6] "Element '{http://myproject.com/test2/1}invoice': '-133.69' is not a valid value of the atomic type '{http://myproject.com/test2/1}positive_decimalType'."            

As shown above, a simple XML validator (xml2) detected all the errors and reported them.

3.5.5 Conclusion

XML language and standards that provides for:

  • Flexibility in data modeling
  • Mechanisms for creating vocabularies (dictionaries)
  • Mechanisms to validate XML content
  • Mechanisms to link internal and external components

In addition to the above, XML is a stable and widely used language, and all that made XML suitable for the objectives of XBRL.

3.6 How Does XBRL Represent Data

Now that we are familiar with XML, we can get into the mechanisms of how XBRL represent data. In this section we first have an overview of the components and specifications of XBRL, some basic concepts of how XBRL represents data, finally we look at real life XBRL examples.

It is important to understand that XBRL taxonomies instance documents are usually created using specialized software that provides for a user friendly interface while the software takes care of the form and syntax behind the scene, still it is important to have knowledge of the elements and components defined in XBRL specifications.

3.6.1 XBRL Components

The figure below tries to visualize the ingredients needed to end up with XBRL report (structured financial report):

XBRL Components

XBRL Components

  1. At the base, we have XML, the foundation for everything else.

  2. XBRL specifications are based on XML, and these specifications provide the building blocks for a reporting system based on XBRL.

  3. XBRL Taxonomy is the most critical ingredient, it uses XBRL specifications to build the structure and the data model for XBRL reporting, we can think of a Taxonomy as the Schema for a particular reporting domain. XBRL Taxonomy consists of:

    • Dictionary/Vocabulary of elements to be used in reporting, in XBRL terminology, these are called “Concepts”.

    • Type Definitions are components or extension of existing components that are the building blocks of Concepts.

    • Linkbases are groups of Xlinks that links concepts together to form a logical structure such as Presentation Linkbase used to link concept together in form to enable correct hierarchical presentation of these concepts in a report or any form of rendering.

    • Other Imported Taxonomies XBRL taxonomies can import other taxonomies to be part of the base taxonomy, this mechanism allows for reusing existing taxonomies rather than recreating something that already exits. All taxonomies imported by the base taxonomy and any other taxonomies that imported taxonomies import all together are called Discoverable Taxonomy Set (DTS). An example for that is the US-GAAP taxonomy which imports Stock Exchange Commission (SEC) taxonomies. Some of terminology relevant to Taxonomy (_based on XBRL Glossary):

      • Base Taxonomy: A taxonomy that is used as the starting point for an extension taxonomy.
      • Extension Taxonomy: A taxonomy that is constructed using one or more other taxonomies (a base taxonomy) as a starting point. Extension taxonomies are typically created by a different entity from the author of the base taxonomy. Extension taxonomies may be created by preparers (see entity-specific extension taxonomy) , or they may be created by a collector making use of a taxonomy from a third party such as an accounting standards body.
      • Entity-specific extension taxonomy: An extension taxonomy that is created by the preparer of an XBRL report in order to disclose information that is specific to the reporting entity (see entity-specific disclosure).
      • Taxonomy Entry Point: A taxonomy entry point identifies a subset (or “view”) of a taxonomy. Taxonomies will often provide multiple views for different, related reporting purposes. For example, a taxonomy may cater for different industries reporting under the same accounting standard. A taxonomy entry point is identified by a unique URL (or set of URLs), and is what is referenced by an XBRL report or an extension taxonomy.
    • Extensions to other taxonomies maybe part of the base taxonomy.

    • Other Resources such as documentation and references may be included in an XBRL Taxonomy.

  4. XBRL Report consists of:

    • Schema containing any extension to the base taxonomy if extension is allowed.
    • Linkbases relevant to the report.
    • Instance Document containing the information for the current report.
  5. Consumer Data Model is where the data transported by XBRL ends up, taxonomies must consider consumer data needs in its design.

3.6.2 XBRL Specifications

As explained previously XBRL is an extension of XML, basically XBRL international used XML to define XBRL components and elements and the result is XBRL specifications.
As of date of this document, the relevant current XBRL specifications recommendations are as follows:

  • XBRL: Core XBRL Specs.
  • Dimensions: The XBRL Dimensions specification enables the reporting of multi-dimensional facts against dimensions defined in an XBRL taxonomy.
  • Extensible Enumerations: Allows for constraining the allowed values for primary reporting concepts (choices from specific list).
  • Formula: XBRL Formula provides a standard mechanism for defining rules in a taxonomy that can be applied against instance documents.
  • Generic Links: A link type with no predefined semantics or constraints. This can be used used as a building block for other specifications.
  • Generic Preferred Label: This specification introduces the preferred label feature for all relationships.
  • Global Ledger: XBRL Specs for transactional reporting.
  • Infrastructure: Specifications in this section are used to support the development of XBRL specifications and registries.
  • Inline XBRL: Inline XBRL, or iXBRL, provides a mechanism for embedding XBRL tags in HTML documents.
  • Registries: Registries provide a centralise list of definitions, allowing implementers to re-use suitable definitions created by others.
  • Table Linkbase: Provides a mechanism for taxonomy authors to define a tabular layout of facts. The resulting tables can be used for both presentation and data entry.
  • Taxonomy & Report Packages: Taxonomy Packages provide a standardised mechanism for providing documentation about the content of a taxonomy.
  • Versioning: Defines an XML syntax for an XBRL versioning Report.

Link for each recommendation includes the normative schema.

3.6.3 XBRL Representation of Data

In the introduction of TDH, it states that XBRL provides a platform to give data meaning [TDH section 1.1.3 page 2]. A piece of data really does not have a meaning without a context or means to associate it with other data points, for example, data about a switch being on or off doesn’t have much value if we don’t know what does this switch do and when was it on or off. XBRL gives meaning to data by providing layers of context.

3.6.3.1 Some Basics

The TDH presents the an example of a monthly expenses report TDH section 2.2 page 15 of a person named “Bob”, the report is in the form of a table with its rows having expenses line items, and columns having months and amounts of expenses.

The TDH explains that expenses amounts alone do not convey much meaning unless associated with dimensions identifying additional information about the amounts, for example, who made the expenses, what is the nature of the expense, and in which periods expenses were made. The intersection of one or more of these dimensions with an amount creates a fact that has contextual meaning.

One of the basic concepts of XBRL design is that it identifies data points by multiple dimensions that gives enough context to the data point to be meaningful, like in the case of the expense report (TDH example), an amount of $900 in the first row, is identified by dimensions Food as nature of expense, and January as expense period, and Bob as the person who made the expense, which creates an XBRL Fact.

The TDH classifies dimensions that identifies facts in XBRL into 2 categories:

  1. Core Dimensions which includes:
    • Concept core dimension: A taxonomy element (dictionary/vocabulary) that provides the meaning for a fact (e.g. Fixed Assets, Revenue, Profit …), concepts are the building blocks of a taxonomy.
    • Period core dimension: Time frame or point of time relevant to the fact.
    • Reporting entity core dimension: The entity reporting the fact, also known as identifier
    • Unit core dimension: Unit of measurement of reported fact (e.g. USD, EURO, KM, KGM, USD/Share…), it is only required for numeric facts.
  2. Taxonomy Defined Dimensions: Concepts that exist for the purpose of grouping facts that should be interpreted in a similar way. Taxonomy Defined Dimensions do not directly define a fact but rather intersect with a fact to add further contextual or semantic information beyond what is added by the core dimensions, for example a country dimension for geographical allocation.

The Core Dimension and Taxonomy Defined Dimensions are defined in the XBRL Taxonomy or its extensions using XBRL components, and then used in an XBRL instance to report facts.

3.6.3.2 XBRL Elements Usage

XBRL specifications define how we can express a financial report, next we will look at the XBRL elements used to describe a data point.

Assuming we want to create an XBRL report form the monthly expenses example, first we need to use XBRL specifications to create a taxonomy containing the vocabulary and linkbases, then we can create an XBRL instance that contains the facts, let’s try to create few elements and discover the basic usage of XBRL elements.

3.6.3.3 Creating XBRL Taxonomy Concept

Concepts in an XBRL taxonomy are elements that provides a meaning for a fact, it is defined in the XBRL Taxonomy schema. Concepts make up the dictionary/vocabulary allowed to be used by the Taxonomy.

In case of a financial reporting taxonomy, concepts may describe numeric financial elements such as Net Profit, Assets or Liabilities, or narrative elements, like Accounting Policies. In short, a concept needs to be created for every reportable element within the domain of the taxonomy, concepts are the backbone of the Taxonomy. Building blocks for a taxonomy concept are defined in XBRL core specifications in namespace {http://www.xbrl.org/2003/instance}. Concepts have 2 main types defined in XBRL taxonomy, item and tuple:

  • item: an Item represents a single fact or business measurement. In the XML Schema for XBRL instances, item is defined as an Abstract Element. This means that it will never appear in its own right in an XBRL Instance. Therefore, all elements representing single facts or business measurements defined in an XBRL taxonomy document and reported in an XBRL instance MUST be either (a) members of the substitution group item; or, (b) members of a substitution group originally based on item.

Note substitutionGroup: A substitution group is a feature of XML schema that allows you to specify elements that can replace another element in documents generated from that schema. The replaceable element is called the head element and must be defined in the schema’s global scope. The elements of the substitution group must be of the same type as the head element or a type that is derived from the head element’s type.

  • tuple: While most business facts can be independently understood, some facts are dependent on each other for proper understanding, especially if multiple occurrences of that fact are being reported. For example, in reporting the management of a company, each manager’s name has to be properly associated with the manager’s correct title. Such sets of facts (manager’s title/manager’s name) are called tuples.

Tuples have complex content and MAY contain both items and other tuples. Like the <item> element, the <tuple> element is abstract.

XBRL Data Types
As mentioned above, when defining an XBRL Concept in the taxonomy, it will be in either item or tuple substitution groups, a data type must be given to the concept the determines what type of data can be stored in this element (for example, numbers, dates, strings, … etc), XBRL uses XML standard types in addition to other derived types, TDH table 2-3 page 28 shows the most common types used in XBRL:

dataType description
stringItemType Represents character strings in XML.
booleanItemType Represents the values of two-valued logic (true, false).
decimalItemType Represents a subset of real numbers, which can be represented by decimal numerals.
dateTimeItemType Represents instants of time, optionally marked with a time zone offset.
integerItemType Represents the standard mathematical concept of integer numbers by fixing the fractional digits of decimal to be 0 and prohibiting the trailing decimal point.
monetaryItemType Represents a decimal with the added constraint of a currency unit.
qNameItemType Represents a qualified XML name.

Above are just a sample of the most commonly used data types, XBRL Specifications [Section 5.1.1.3] lists more data types, also other XBRL data types are defined in XBRL Data Types Registry.

Let’s define Food concept (from the monthly expenses report), with the following characteristics:

  • Has a debit balance,
  • Its value Cannot be null (absent value), it can have a value of 0 though,
  • It is a monetary item, meaning that it needs to have a numeric value and a unit
Concept is defined in the taxonomy SCHEMA as follows:
<!-- From taxonomy schema file (.xsd) -->


<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"


  xmlns:example="http://www.expenses.com/taxonomy"


  xmlns:xbrli="http://www.xbrl.org/2003/instance"


  attributeFormDefault="unqualified" elementFormDefault="qualified"


  targetNamespace="http://www.expenses.com/taxonomy">


    


    <element 


      xbrli:name="Food"


      xbrli:periodType="duration"


      xbrli:balance="debit"


      nillable="false"


      abstract="false"


      type="xbrli:monetaryItemType"


      substitustionGroup="xbrli:item"


      id="expense_Food"/>


        


</xs:schema>

Notes:

  • Namespace http://www.xbrl.org/2003/instance prefixed as xbrli was declared for XBRL specification schema to be able to use elements form that namespace.
  • We gave our taxonomy the namespace http://www.expenses.com/taxonomy prefixed as expenses
  • duration was selected for @xbrli:periodType XBRL attribute, because this is an expense that occurs during a specified period (not a balance at a moment of time).
  • xbrli:monetaryItemType was assigned to @type to reflect the type of data expected to be reported for this concept.
  • Each element must have a unique id.
  • Because we refereed to XBRL specification, this schema document can be validated against XBRL specifications.

3.6.3.4 XBRL Instance Document

Instance document is the actual report containing the facts and information for the report, it is constructed using XBRL constructs. The root element of XBRL instance document is <xbrl>, and it is defined in XBRL specification in the namespace {http://www.xbrl.org/2003/instance}, a diagram for the xbrl element declarations is as follows:

XBRL Type

XBRL Type Declaration

The XBRL allowed child elements are as follows:
A. Links to schema and declaration used to construct the report:

  • <SchemaRef>: An XML simple type link to location of the entry point of the taxonomy relevant to this report. This element is defined in namespace {http://www.xbrl.org/2003/linkbase}.
  • <linkbaseRef>: An XML simple type link to location of linkbase relevant to this report. this element is defined in namespace {http://www.xbrl.org/2003/linkbase} (See section 3.7.4 Linkbases).
  • <roleRef>: An XML simple type link to location of declaration of a roleType used in this report. Element is defined in namespace {http://www.xbrl.org/2003/linkbase}
  • <arcroleRef>: An XML simple type link to location of declaration of a arcroleType used in this report. Element is defined in namespace {http://www.xbrl.org/2003/linkbase}

B. Elements used to carry the information of current report:

3.6.3.4.1 Creating XBRL instance Context

Assuming we want to report that Bob’s Food expenses for January 2020 was $900, note here that we attached 3 pieces of additional information to the expense amount, Food the concept core dimension, Bob the owner of the expense and January 2020 the period core dimension. we already defined the Food concept above, to attach the owner of the expenses and the period we need to use XBRL context element.

context is an XBRL element used in XBRL instance document (report) and referenced by one or more fact(s) in the XBRL report. It contains information about period, entity, and other taxonomy defined dimension relating to this context, following is a diagram of context type declaration:

Context Type

Context Type Declaration

We can define a context for Bob owner, and January 2020 period as follows:

<!-- defined in instance document -->


<xbrl xmlns="http://www.xbrl.org/2003/instance"


      xmlns:expenses="http://www.expenses.com/taxonomy"


      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-US">


    <!-- ... at least one link:schemaRef element goes here ... -->


    <context id="01">


      <entity>


        <identifier scheme="http://www.example.com/bob">Bob</identifier>


      </entity>


      <period>


        <startDate>2020-01-01</startDate>


        <endDate>2020-01-31</endDate>


      </period>


    </context>


</xbrl> 

Notes XBRL instance document

  • XBRL instance document root element must be element <xbrl>
  • We referenced our taxonomy namespace to be able to use elements defined in that taxonomy.
  • We referenced XBRL schema (with no prefix) to be able to use XBRL.
  • Because of the references above, this XBRL instance document can be validated against XBRL specifications and our taxonomy.
3.6.3.4.2 Creating XBRL instance unit
XBRL requires that numeric type facts has a reference to a unit [see XBRL specs 4.6.2]. And since our concept is a monetary type which is numeric type, then we need to create a unit in our instance, in addition to the context before we are able to create a fact. Following is a diagram for the declaration of the unit type in XBRL specifications:
Unit Type

Unit Type Declaration

We declare a unit for United States Dollars using iso4217 taxonomy USD element as follows:

<!-- Added to previous instant document as child to <xbrl> element -->


<unit id="usd" xmlns:iso4217="http://www.xbrl.org/2003/iso4217">


  <measure>iso4217:USD</measure>


</unit>
3.6.3.4.3 Creating XBRL instance fact

Now that we have Food concept in our XBRL Taxonomy and have a context with id=01 and a unit of id="usd" in our instance document, we can create a fact for Bob’s Food expenses for the period of January 2020 for the amount of 900 United States Dollars as follows:

<!-- Added to previous instant document as child to <xbrl> element -->


<expenses:Food


  contextRef="01" 


  decimals="0" 


  id="fact_001" 


  unitRef="usd">900</expenses:Food>

3.6.3.5 XBRL Dimensions

As mentioned XBRL provides tools for reporting multidimensional facts, as mentioned core dimensions (Concept, period, reporting entity and unit) are available from the XBRL base specifications, in addition to some other tools, for taxonomy defined dimensions and more complex multidimensional structures XBRL Dimensions Specifications are used.

3.6.3.5.1 Additional Dimensions from base XBRL

XBRL element context has 2 additional features that can provide dimensionality to a fact, the <segment> and <scenario> as follows:

  • <segment>: is defined in XBRL specifications as “an optional container for additional mark-up that the preparer of an XBRL Instance SHOULD use to identify the business segment more completely in cases where the Entity identifier is insufficient.” It should also be mentioned that the <segment> element is a child element of the <entity> element (which in turn is a child element of the <context> element) used to link with taxonomy defined dimension using XBRL Dimensions Specifications.

  • <scenario>: XBRL specifications describes this element as “Business facts can be reported as actual, budgeted, restated, pro forma, etc. For internal reporting purposes, there can be an even greater variety of additional metadata that preparers want to associate with items. The optional element allows additional valid mark-up (see note above regarding segment) to be included for this purpose.”

Segment and Scenario Example

In the monthly expense report example, assume that Bob has 2 locations to track expenses for home and office (segments), also assume that Bob tracks budget and actuals (scenarios), to be able to include these dimensions in our report we need first to create an extension taxonomy to include these elements as follows:

<!-- Report specific taxonomy extension -->


<schema targetNamespace="http://bobreport.com/xbrl/taxonomy" 


        xmlns:bob="http://bobreport.com/xbrl/taxonomy" 


        xmlns="http://www.w3.org/2001/XMLSchema" 


        xmlns:xbrli="http://www.xbrl.org/2003/instance">


          


    <!-- Type for segments -->


    <simpleType name="locationsType">


        <restriction base="token">


            <enumeration value="home"/>


            <enumeration value="office"/>


        </restriction>


    </simpleType>


          


    <!-- report specific segment sub-element -->


    <element name="locations" type="bob:locationsType" />


          


          


    <!-- Type for scenarios -->


    <simpleType name="actualBudgetType">


        <restriction base="token">


            <enumeration value="actual"/>


            <enumeration value="budget"/>


        </restriction>


    </simpleType>


          


    <!-- report specific scneario sub-element -->


    <element name="actualBudget" type="bob:actualBudgetType" />


          


          


          


</schema>

Note

Elements contained by the <scenario> element MUST NOT be defined in the http://www.xbrl.org/2003/instance namespace. Also, they MUST NOT be in the substitution group for elements defined in the http://www.xbrl.org/2003/instance namespace. The element MUST NOT be empty.

To report facts using locations and/or budget vs actual elements, namespace http://bobreport.com/xbrl/taxonomy must be referenced in our instance report to be able access these elements, then we need to create contexts that reference these elements, and finally we can reference these contexts in the reported facts as follows:

<!-- Added to previous instant document as children to <xbrl> element -->


  <xbrl ....... xmlns:bob="http://bobreport.com/xbrl/taxonomy">


  <!-- ... at least one link:schemaRef element goes here ... -->


    <context id="02">


      <entity>


        <identifier scheme="http://www.example.com/bob">Bob</identifier>


        <segment>


          <bob:locations>bob:home</bob:location>


      </segment>


      </entity>


      <period>


        <startDate>2020-01-01</startDate>


        <endDate>2020-01-31</endDate>


      </period>


      <scenario>


          <bob:actualBudget>bob:actual</bob:actualBudget>


      </scenario>


    </context>

Now having context id=02 we can reference the facts that include actual figures for location home in our instance report.

3.6.3.5.2 Taxonomy defined dimensions

Taxonomy defined dimensions enable creation of complex structures in XBRL taxonomy and reports. This is achieved through the interactions between concepts and linkbases, this is best described in TDH section 2.2.5 page 21 as follows:

A taxonomy-defined dimension is a grouping of concepts that is used to add organizational structure to facts. These dimensional concepts should not be directly associated with a data point but rather are employed to indicate additional contextual information beyond the simple semantic identifier or what is provided through any of the other core dimensions. Expanding the expense example by attributing the monthly expenses to two people in the same household creates a level of complexity that cannot be easily represented with only concepts. Previously, there were only two dimensions: expenses (as rows) and months (as columns).

Some XBRL Dimensions terminology

  • Dimension: A qualifying characteristic that is used to uniquely define a data point (other than core dimensions) for example a “Geography Dimension”.
  • Domain: A set of related values. Examples of different domains for use on a “geography” dimension would be “Countries”, “Continents” or “States”. In XBRL, domains are defined using taxonomy elements that are used to group domain members.
  • Domain member: An element representing one of the possibilities within a domain.
  • Cube: A cube is defined by combining a set of dimensions with a set of concepts. Cubes are often referred to as “hypercubes”, as unlike a physical, 3-dimensional cube, a hypercube may have any number of dimensions.

All the above constructs are defined as concepts, but using XBRL specifications for the @type and @substitutionGroup attributes used for defining a concept.

The TDH at this section, splits the monthly expenses by Bob’s children, with each month split into 2 columns for each of Bob’s children. Assume that we want to organize this information in XBRL by doing the following:

  • Create a grouping concept or header called expenses to group all the expenses together,
  • Create persons dimension, and then create a domain for bobChildrenDomain and domain member for each child referenced in the report.

This can be implemented in XBRL as follows:

<!-- Report specific taxonomy extension -->


<schema targetNamespace="http://bobreport.com/xbrl/taxonomy" 


        xmlns:bob="http://bobreport.com/xbrl/taxonomy" 


        xmlns="http://www.w3.org/2001/XMLSchema" 


        xmlns:xbrli="http://www.xbrl.org/2003/instance">


        <!-- note here we included xbrl dimensions specs to have access to its elements -->


        xmlns:xbrldt="http://xbrl.org/2005/xbrldt"


        xmlns:dtr-types="http://www.xbrl.org/dtr/type/2020-01-21"


        


        <!-- create a grouping expense element -->


        <element abstract="true" 


                 id="expenses_abstract" 


                 name="ExpensesAbstract" 


                 nillable="true"


                 xbrli:balance="debit"


                 substitutionGroup="xbrli:item" 


                 type="xbrli:monetaryItemType" 


                 xbrli:periodType="duration"/>


        


        <!-- create persons dimension -->


        <element abstract="true" 


                 id="dim_01_persons" 


                 name="personsDim" 


                 nillable="true" 


                 substitutionGroup="xbrldt:dimensionItem" 


                 type="xbrli:stringItemType" 


                 xbrli:periodType="duration"/>


        <!-- create children domain -->        


        <element abstract="true" 


                id="domain_01_children" 


                name="ChildrenDomain" 


                nillable="true" 


                substitutionGroup="xbrli:item" 


                type="dtr-types:domainItemType" 


                xbrli:periodType="duration"/>


                  


          <!-- create domain member for each child -->


          <element 


              abstract="true" 


              id="members_01_childOneMember"


              name="ChildOneMember"


              nillable="true" 


              substitutionGroup="xbrli:item" 


              type="dtr-types:domainItemType" 


              xbrli:periodType="duration"/>


          <element 


              abstract="true" 


              id="members_02_childTwoMember"


              name="ChildTwoMember"


              nillable="true" 


              substitutionGroup="xbrli:item" 


              type="dtr-types:domainItemType" 


              xbrli:periodType="duration"/>


</schema>


<!-- note attributes usef from dtr-types and xbrldt namespaces>

Notes All elements defined above has the @abstract attribute as ture, this means that this element is not allowed to be used in XBRL instance document to report facts, this element is only for organization purposes.

Now we can reference the dimension in the in the instance document through <context> element as follows:

<!-- Added to previous instant document as children to <xbrl> element -->


  <xbrl ....... xmlns:bob="http://bobreport.com/xbrl/taxonomy"


                xmlns:xbrldi="http://xbrl.org/2006/xbrldi">


  <!-- ... at least one link:schemaRef element goes here ... -->


    <context id="03">


      <entity>


        <identifier scheme="http://www.example.com/bob">Bob</identifier>


      </entity>


      <period>


        <startDate>2020-01-01</startDate>


        <endDate>2020-01-31</endDate>


      </period>


  


      <segment>


          <bob:locations>bob:home</bob:location>


          <xbrldi:explicitMember


                  dimension="bob:personsDim">bob:ChildOneMember


          </xbrldi:explicitMember>


      </segment>


  


      <scenario>


          <bob:actualBudget>bob:actual</bob:actualBudget>


      </scenario>


  


    </context>

Now facts reporting actual expenses, for home location, relating to child one for January 2020 can use the above context and have all expenses grouped under one heading using the ExpensesAbstract element.

Notes There are two types of members explicit members, and typed member, the first type is where members are explicitly defined in the taxonomy and no other members can be used with that domain except the defined members. On the other hand typed members, only type of the member is defined in the taxonomy, and any can be used if it matched the type.

Keep in mind that XBRL dimensions specifications rely heavily on the linking mechanisms provided by XBRL through linkbases, which will be the next topic.

3.6.4 XBRL Linkbases

We have looked at how to create taxonomy elements and taxonomy defined dimensions, and how to use these elements in XBRL instance report, XBRL linkbases (based on XML XLink) provides for a mechanism to create relationships between those elements and with other internal or external resources to create a meaningful self-describing data structure.

3.6.4.1 The basics

As mentioned XBRL makes use of XML XLink specifications, generally speaking, there are two main categories of links:

  • Simple Links: A simple link in XLink creates a unidirectional hyperlink from one element to another through a URI. The element containing the link (the source element) is linked to a destination element. This destination element is not connected to the source element. This is common in HTML hyperlinking, where a link on one website may lead a user to an additional website, but that additional website may not contain a link back to the source location.

  • Extended Links: Provide for multiple resources at the source or destination to be connected via multiple arcs. An arc contains information about the origin, destination, and the behavior of a link between two resources. The origin resource and the destination resource are defined by labels. Through one or more arcs, extended links achieve complex connections among multiple resources. Like simple links, extended links can define relationships between elements within the same namespace or across different namespaces.

It is important to note that Extended Links creates relationships between elements using arcs that describes the behavior of the relationship.

XBRL specifications defines several types of links based on XLink specs, most common links and arcs are [based on XBRL Glossary]:

  • Presentation Links: An extended link providing for the organisation of taxonomy elements into a hierarchical structure with the aim of providing a means of visualizing or navigating the taxonomy. [At a technical level, the presentation tree is defined using the parent-child arcrole in the XBRL specification]

  • Calculation Links: An extended link providing relationships between concepts in a taxonomy for the purpose of describing and validating simple totals and subtotals. [At a technical level, these relationships are defined using the summation-item arcrole in the XBRL specification]

  • Label links: An extended link providing a relationship between concept and human readable description of a taxonomy component. XBRL labels can be defined in multiple languages and can be of multiple types, such as a “standard label”, which provides a concise name for the component, or a “documentation label” which provides a more complete definition of the component. Example of arcroles label, terseLabel, periodStartLabel, periodEndLabel, totalLabel

  • Definition Links: An extended providing for relationships that arranges pairs of concepts in a specific semantic relationship. These relationships may be above and beyond calculation or presentation relationships. Concept core dimensions cannot be used in a definition relationship, and is primarily used for dimensional relationships in XBRL Dimensions specifications. Example arcroles hypercube-dimension, dimenstion-domain, domain-member, dimenstion-defualt

  • Reference link: An extended link providing for relation between elements of the taxonomy and external reference such as accounting standards, or laws. Example arcrole concept-reference.

  • Formula link: An extended link providing relations necessary to define formulae (XBRL Formula Specification) used in validating XBRL instances. Example arcrole variable-set, variable-set-filter.

  • Table Linkbase: an extended link providing relations needed for tabular view of a taxonomy or report that is used for presentation or data entry purposes. XBRL reporting templates can support complex, multi-dimensional reports, such as those seen in prudential reporting, and provide a business user-friendly view of the data. XBRL reporting templates are typically used in closed reporting programs, where a template is prescribed by the collector. [At a technical level, XBRL reporting templates are defined using the Table Linkbase specification]

  • footnote links: A footnote adds further explanatory information to a statement or fact. In XBRL, footnotes are created through relationships between note text and facts using the footnote relationships. One instance of footnote text can be linked to multiple facts. The note core ID dimension is the dimension on the fact that associates the fact with one or more footnotes arcs.

  • Generic Links: A link type with no predefined semantics or constraints. This can be used as a building block for other specifications, such as Generic Labels 1.0 and Generic References 1.0 to define relationships with particular semantics.

3.6.5 Example - Income Statement Taxonomy and Linkbases

In this section we will create taxonomy and linkbases for a simple Income Statement.

3.6.5.1 Form

We want to create taxonomy and links for a Income Statement that looks as follows:

Year Ended
(In EGP) 31-12-2020 31-12-2019
Revenue
Product 2,000 2,500
Service 3,000 1,500
Total Revenue 5,000 4,000
Cost of Revenue
Product 1,000 1,250
Service 2,000 1,000
Total Cost of Revenue 3,000 2,250
Gross Profit 2,000 1,750
Expenses 500 420
Net Profit 1,500 1,330

3.6.5.2 Taxonomy

First we create our schema/taxonomy as follows:

<?xml version="1.0" encoding="utf-8"?>


<!-- edited with XMLSpy v2021 rel. 3 (x64) (http://www.altova.com) by Sherif (None) -->


<xs:schema targetNamespace="http://xyz.abc/IncomeStatementExample" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:altovaext="http://www.altova.com/xslt-extensions" xmlns:altova-xfi="http://www.altova.com/xslt-extensions/xbrl" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xl="http://www.xbrl.org/2003/XLink" xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:xfi="http://www.xbrl.org/2008/function/instance" xmlns:dtr="http://www.xbrl.org/2009/dtr" xmlns:xff="http://www.xbrl.org/2010/function/formula" xmlns:dtr-types="http://www.xbrl.org/dtr/type/2020-01-21" xmlns:nonnum="http://www.xbrl.org/dtr/type/non-numeric" xmlns:xbrldt="http://xbrl.org/2005/xbrldt" xmlns:ea="http://xbrl.org/2008/assertion/existence" xmlns:bf="http://xbrl.org/2008/filter/boolean" xmlns:cf="http://xbrl.org/2008/filter/concept" xmlns:df="http://xbrl.org/2008/filter/dimension" xmlns:formula="http://xbrl.org/2008/formula" xmlns:gen="http://xbrl.org/2008/generic" xmlns:label="http://xbrl.org/2008/label" xmlns:reference="http://xbrl.org/2008/reference" xmlns:variable="http://xbrl.org/2008/variable" xmlns:crf="http://xbrl.org/2010/filter/concept-relation" xmlns:msg="http://xbrl.org/2010/message" xmlns:valm="http://xbrl.org/2010/message/validation" xmlns:table="http://xbrl.org/2014/table" xmlns:sev="http://xbrl.org/2016/assertion-severity" xmlns:example="http://xyz.abc/IncomeStatementExample">


    <xs:annotation>


        <xs:documentation>


        Schema/Taxonomy for Income Statement Example


      </xs:documentation>


        <xs:appinfo>


            <link:linkbaseRef xlink:type="simple" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_tab.xml"/>


            <link:roleType id="BlockedConceptsSegmentRole" roleURI="http://xyz.abc/role/BlockedConceptsSegment">


                <link:definition>Prevents default use of line items (i.e. when not explicitly allowed) for segment</link:definition>


                <link:usedOn>link:definitionLink</link:usedOn>


            </link:roleType>


            <link:linkbaseRef xlink:type="simple" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_for.xml"/>


            <link:roleType id="roleType_IncomeStatement" roleURI="http://xyz.abc/role/IncomeStatement">


                <link:definition>10000 - Statement - Income Statement</link:definition>


                <link:usedOn>link:calculationLink</link:usedOn>


                <link:usedOn>link:definitionLink</link:usedOn>


                <link:usedOn>link:presentationLink</link:usedOn>


            </link:roleType>


            <link:linkbaseRef xlink:type="simple" xlink:role="http://www.xbrl.org/2003/role/labelLinkbaseRef" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_lab_en.xml"/>


            <link:linkbaseRef xlink:type="simple" xlink:role="http://www.xbrl.org/2003/role/labelLinkbaseRef" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_lab_ar.xml"/>


            <link:linkbaseRef xlink:type="simple" xlink:role="http://www.xbrl.org/2003/role/presentationLinkbaseRef" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_pre.xml"/>


            <link:linkbaseRef xlink:type="simple" xlink:role="http://www.xbrl.org/2003/role/definitionLinkbaseRef" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_def.xml"/>


            <link:linkbaseRef xlink:type="simple" xlink:role="http://www.xbrl.org/2003/role/calculationLinkbaseRef" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="is_cal.xml"/>


            <link:linkbaseRef xlink:type="simple" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" xlink:href="gla_ar.xml"/>


        </xs:appinfo>


    </xs:annotation>


    <xs:import namespace="http://www.xbrl.org/2003/instance" schemaLocation="http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"/>


    <xs:import namespace="http://www.xbrl.org/dtr/type/non-numeric" schemaLocation="http://www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd"/>


    <xs:import namespace="http://xbrl.org/2005/xbrldt" schemaLocation="http://www.xbrl.org/2005/xbrldt-2005.xsd"/>


    <xs:import namespace="http://www.xbrl.org/dtr/type/2020-01-21" schemaLocation="https://www.xbrl.org/dtr/type/2020-01-21/types.xsd"/>


    <xs:element name="GrossMarginPercentConcept" id="id_element1" type="dtr-types:percentItemType" substitutionGroup="xbrli:item" nillable="true" abstract="false" xbrli:periodType="duration"/>


    <xs:element name="SharesOutstandingConcept" id="example_SharesOutstandingConcept" type="xbrli:sharesItemType" substitutionGroup="xbrli:item" nillable="true" abstract="false" xbrli:periodType="duration"/>


    <xs:element name="EarningPerShareConcept" id="example_EarningPerShareConcept" type="dtr-types:perShareItemType" substitutionGroup="xbrli:item" nillable="true" abstract="false" xbrli:periodType="duration"/>


    <xs:element name="CostOfRevenueConcept" id="example_CostOfRevenueConcept" type="xbrli:monetaryItemType" substitutionGroup="xbrli:item" abstract="false" xbrli:balance="debit" xbrli:periodType="duration"/>


    <xs:element name="ExpensesConcept" id="example_ExpensesConcept" type="xbrli:monetaryItemType" substitutionGroup="xbrli:item" abstract="false" xbrli:balance="debit" xbrli:periodType="duration"/>


    <xs:element name="GrossProfitConcept" id="example_GrossProfitConcept" type="xbrli:monetaryItemType" substitutionGroup="xbrli:item" abstract="false" xbrli:balance="credit" xbrli:periodType="duration"/>


    <xs:element name="IncomeStatementConceptAbstract" id="example_IncomeStatementConceptAbstract" type="xbrli:stringItemType" substitutionGroup="xbrli:item" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="IncomeStatementTable" id="example_IncomeStatementTable" type="xbrli:stringItemType" substitutionGroup="xbrldt:hypercubeItem" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="NetProfitConcept" id="example_NetProfitConcept" type="xbrli:monetaryItemType" substitutionGroup="xbrli:item" abstract="false" xbrli:balance="credit" xbrli:periodType="duration"/>


    <xs:element name="ProductMember" id="example_ProductMember" type="nonnum:domainItemType" substitutionGroup="xbrli:item" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="ProductServiceAxis" id="example_ProductServiceAxis" type="xbrli:stringItemType" substitutionGroup="xbrldt:dimensionItem" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="ProductServiceDomain" id="example_ProductServiceDomain" type="nonnum:domainItemType" substitutionGroup="xbrli:item" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="RevenueConcept" id="example_RevenueConcept" type="xbrli:monetaryItemType" substitutionGroup="xbrli:item" abstract="false" xbrli:balance="credit" xbrli:periodType="duration"/>


    <xs:element name="ServiceMember" id="example_ServiceMember" type="nonnum:domainItemType" substitutionGroup="xbrli:item" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="StatementLineItems" id="example_StatementLineItems" type="xbrli:stringItemType" substitutionGroup="xbrli:item" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="BlockedLineItemsAbstract" id="example_BlockedLineItemsAbstract" type="xbrli:stringItemType" substitutionGroup="xbrli:item" nillable="true" abstract="true" xbrli:periodType="instant"/>


    <xs:element name="BlockedLineItemsTable" id="example_BlockedLineItemsTable" type="xbrli:stringItemType" substitutionGroup="xbrldt:hypercubeItem" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="EmptyAxis" id="example_EmptyAxis" type="xbrli:stringItemType" substitutionGroup="xbrldt:dimensionItem" nillable="true" abstract="true" xbrli:periodType="duration"/>


    <xs:element name="BlockedConcept" id="example_BlockedConcept" type="xbrli:monetaryItemType" substitutionGroup="xbrli:item" abstract="false" xbrli:balance="credit" xbrli:periodType="duration"/>


</xs:schema>

Note that the root element for the entry point of our taxonomy is <schema> as any XML schema document.

The schema/taxonomy document relevant components can be analyzed as follows:

3.6.5.2.1 Imports

Importing other schemas and taxonomies to be used in our taxonomy using <import> element as follows:

tag namespace schemaLocation description
import http://www.xbrl.org/2003/instance http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd Imports base XBRL instance types
import http://www.xbrl.org/dtr/type/non-numeric http://www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd Imports nonNumeric types
import http://xbrl.org/2005/xbrldt http://www.xbrl.org/2005/xbrldt-2005.xsd Imports XBRL Dimensions
import http://www.xbrl.org/dtr/type/2020-01-21 https://www.xbrl.org/dtr/type/2020-01-21/types.xsd Imports data type registry

Within <annotation> schema element we can add documentation describing the document in addition to some information to be used by the processor through the <appinfo>, these information includes but not limited to; defining extended link roles and linkbase references (references to linkbase files).

3.6.5.2.2 Role Types

Defining Extended LinkRoles using <roleType> element as in our example as follows:
The extended link role for the income Statement has URI http://xyz.abc/role/IncomeStatement and can be used on presentation, calculation and definition links:

<link:roleType id="roleType_IncomeStatement" roleURI="http://xyz.abc/role/IncomeStatement">


    <link:definition>10000 - Statement - Income Statement</link:definition>


                <link:usedOn>link:calculationLink</link:usedOn>


                <link:usedOn>link:definitionLink</link:usedOn>


                <link:usedOn>link:presentationLink</link:usedOn>


</link:roleType>

Note the extended link role needs to have a unique @id and @roleURI attributes.

3.6.5.2.3 Linkbases references

Linking to Linkbases files using <linkbaseRef> element as in our example as follows:

tag type arcrole href role description
linkbaseRef simple http://.../linkbase is_tab.xml http://.../NA Table Linkbase
linkbaseRef simple http://.../linkbase is_for.xml http://.../NA Fromula Linkbase (for validation)
linkbaseRef simple http://.../linkbase is_lab_en.xml http://.../labelLinkbaseRef English Labels linkbase
linkbaseRef simple http://.../linkbase is_lab_ar.xml http://.../labelLinkbaseRef Arabic Labels linkbase
linkbaseRef simple http://.../linkbase is_pre.xml http://.../presentationLinkbaseRef Presentation linkbase
linkbaseRef simple http://.../linkbase is_def.xml http://.../definitionLinkbaseRef Definition linkbase (Dimensions)
linkbaseRef simple http://.../linkbase is_cal.xml http://.../calculationLinkbaseRef Calculation linkbase
linkbaseRef simple http://.../linkbase gla_ar.xml http://.../NA Arabic ELR definition


3.6.5.2.4 Taxonomy elements/vocabulary:

The <element> tag is used to define concepts, either concept core dimensions or taxonomy defined dimensions as follows:

tag name id type substitutionGroup nillable abstract periodType balance
Concept Core Dimensions
element GrossMarginPercentConcept id_element1 dtr-types:percentItemType xbrli:item true false duration NA
element SharesOutstandingConcept example_SharesOutstandingConcept xbrli:sharesItemType xbrli:item true false duration NA
element EarningPerShareConcept example_EarningPerShareConcept dtr-types:perShareItemType xbrli:item true false duration NA
element CostOfRevenueConcept example_CostOfRevenueConcept xbrli:monetaryItemType xbrli:item NA false duration debit
element ExpensesConcept example_ExpensesConcept xbrli:monetaryItemType xbrli:item NA false duration debit
element GrossProfitConcept example_GrossProfitConcept xbrli:monetaryItemType xbrli:item NA false duration credit
element NetProfitConcept example_NetProfitConcept xbrli:monetaryItemType xbrli:item NA false duration credit
element RevenueConcept example_RevenueConcept xbrli:monetaryItemType xbrli:item NA false duration credit
element BlockedConcept example_BlockedConcept xbrli:monetaryItemType xbrli:item NA false duration credit
Taxonomy Defined Dimensions
element IncomeStatementConceptAbstract example_IncomeStatementConceptAbstract xbrli:stringItemType xbrli:item true true duration NA
element IncomeStatementTable example_IncomeStatementTable xbrli:stringItemType xbrldt:hypercubeItem true true duration NA
element ProductMember example_ProductMember nonnum:domainItemType xbrli:item true true duration NA
element ProductServiceAxis example_ProductServiceAxis xbrli:stringItemType xbrldt:dimensionItem true true duration NA
element ProductServiceDomain example_ProductServiceDomain nonnum:domainItemType xbrli:item true true duration NA
element ServiceMember example_ServiceMember nonnum:domainItemType xbrli:item true true duration NA
element StatementLineItems example_StatementLineItems xbrli:stringItemType xbrli:item true true duration NA
element BlockedLineItemsAbstract example_BlockedLineItemsAbstract xbrli:stringItemType xbrli:item true true instant NA
element BlockedLineItemsTable example_BlockedLineItemsTable xbrli:stringItemType xbrldt:hypercubeItem true true duration NA
element EmptyAxis example_EmptyAxis xbrli:stringItemType xbrldt:dimensionItem true true duration NA


3.6.5.3 Presentation linkbase

Presentation linkbase is used to define concepts relationships in terms of presentation and rendering, in other words it organizes concepts by defining the order and grouping of concepts within the taxonomy, also it is used for rendering a taxonomy in a human readable format.

Presentation linkbase XML file:

<?xml version="1.0" encoding="utf-8"?>


<link:linkbase xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:link="http://www.xbrl.org/2003/linkbase">


    <link:documentation>Presentation linkbase for income statement example</link:documentation>


    <link:roleRef roleURI="http://xyz.abc/role/IncomeStatement" xlink:type="simple" xlink:href="is.xsd#roleType_IncomeStatement"/>


    <link:presentationLink xlink:type="extended" xlink:role="http://xyz.abc/role/IncomeStatement">


        <link:presentationArc order="7.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_SharesOutstandingConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_SharesOutstandingConcept" xlink:label="example_SharesOutstandingConcept"/>


        <link:presentationArc order="6.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_EarningPerShareConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_EarningPerShareConcept" xlink:label="example_EarningPerShareConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementConceptAbstract" xlink:label="example_IncomeStatementConceptAbstract"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementTable" xlink:label="example_IncomeStatementTable"/>


        <link:presentationArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_IncomeStatementConceptAbstract" xlink:to="example_IncomeStatementTable"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceAxis" xlink:label="example_ProductServiceAxis"/>


        <link:presentationArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_IncomeStatementTable" xlink:to="example_ProductServiceAxis"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceDomain" xlink:label="example_ProductServiceDomain"/>


        <link:presentationArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_ProductServiceAxis" xlink:to="example_ProductServiceDomain"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductMember" xlink:label="example_ProductMember"/>


        <link:presentationArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_ProductServiceDomain" xlink:to="example_ProductMember"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ServiceMember" xlink:label="example_ServiceMember"/>


        <link:presentationArc order="2.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_ProductServiceDomain" xlink:to="example_ServiceMember"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_StatementLineItems" xlink:label="example_StatementLineItems"/>


        <link:presentationArc order="2.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_IncomeStatementTable" xlink:to="example_StatementLineItems"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_RevenueConcept" xlink:label="example_RevenueConcept"/>


        <link:presentationArc order="1.0" preferredLabel="http://www.xbrl.org/2003/role/totalLabel" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_RevenueConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_CostOfRevenueConcept" xlink:label="example_CostOfRevenueConcept"/>


        <link:presentationArc order="2.0" preferredLabel="http://www.xbrl.org/2003/role/totalLabel" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_CostOfRevenueConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_GrossProfitConcept" xlink:label="example_GrossProfitConcept"/>


        <link:presentationArc order="3.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_GrossProfitConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ExpensesConcept" xlink:label="example_ExpensesConcept"/>


        <link:presentationArc order="4.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_ExpensesConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_NetProfitConcept" xlink:label="example_NetProfitConcept"/>


        <link:presentationArc order="5.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="example_StatementLineItems" xlink:to="example_NetProfitConcept"/>


    </link:presentationLink>


</link:linkbase>

Note that the root element is <linkbase>, which can have only four types of children elements (see linkbase element)

The presentation linkbase relevant components can be analyzed as follows:

3.6.5.3.1 roleRef

Element <roleRef> references the <roleType> declaration in the schema and is repeated for each roleType declared, following is the `roleRef`` from our example:

tag roleURI type href description
roleRef http://xyz.abc/role/IncomeStatement simple is.xsd#roleType_IncomeStatement See roleType
3.6.5.3.2 Relations (arcs)

As mentioned the network of relations is a tree structure with a root, in our case for linkrole http://xyz.abc/role/IncomeStatement the root element is Income Statement [Abstract] that is meant to group together all Income statement elements, the network can be described in a table as follows (@from and @to refers to locators ids):

tag order type arcrole from to preferredLabel
presentationArc 1.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_IncomeStatementConceptAbstract example_IncomeStatementTable NA
presentationArc 1.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_IncomeStatementTable example_ProductServiceAxis NA
presentationArc 2.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_IncomeStatementTable example_StatementLineItems NA
presentationArc 1.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_ProductServiceAxis example_ProductServiceDomain NA
presentationArc 1.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_ProductServiceDomain example_ProductMember NA
presentationArc 2.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_ProductServiceDomain example_ServiceMember NA
presentationArc 1.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_RevenueConcept http://www.xbrl.org/2003/role/totalLabel
presentationArc 2.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_CostOfRevenueConcept http://www.xbrl.org/2003/role/totalLabel
presentationArc 3.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_GrossProfitConcept NA
presentationArc 4.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_ExpensesConcept NA
presentationArc 5.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_NetProfitConcept NA
presentationArc 6.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_EarningPerShareConcept NA
presentationArc 7.0 arc http://www.xbrl.org/2003/arcrole/parent-child example_StatementLineItems example_SharesOutstandingConcept NA

Notes

  • <presentationArc> is used to establish presentation relationships in a presentation network.
  • parent-child arcrole is used for presentation relationship
  • @preferredLabel is used on presentationArc to determine which label role to display (see label linkbase)
  • @order is used on presentationArc to determine the order of appearance of concept when presented.
3.6.5.3.3 Hierarchical View

A hierarchical view of presentation link (Concepts labels are used):

Concept Label* Order within Group depth
10000 - Statement - Income Statement Container
Income Statement [Abstract] 1 Root
Income Statement [Table] 1 2
Product And Service [Axis] 1 3
Product And Service [Domain] 1 4
Product [Member] 1 5
Service [Member] 2 5
Statement [Line Items] 2 3
Total Revenues 1 4
Total Costs of Revenues 2 4
Gross Profit 3 4
Expenses 4 4
Net Profit 5 4
Earnings Per Share 6 4
Shares Outstanding 7 4
* Concepts preferred labels are used in this table

A logical view of the presentation link role will be as follows:

Presentation Link Diagram

Presentation Link Diagram (figure created using draw.io)

3.6.5.4 Calculation linkbase

Calculation linkbase is used to describe calculation relationships between concepts in terms of totals and subtotals, it is important to keep in mind that XBRL itself does not do any calculations, it just describe the calculation relationship, in other words XBRL just describe that whatever amount that concept A has is the total of concepts b and c, nothing more.

Calculation linkbase XML file:

<?xml version="1.0" encoding="utf-8"?>


<link:linkbase xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:link="http://www.xbrl.org/2003/linkbase">


    <link:roleRef roleURI="http://xyz.abc/role/IncomeStatement" xlink:type="simple" xlink:href="is.xsd#roleType_IncomeStatement"/>


    <link:calculationLink xlink:type="extended" xlink:role="http://xyz.abc/role/IncomeStatement">


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_GrossProfitConcept" xlink:label="example_GrossProfitConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_RevenueConcept" xlink:label="example_RevenueConcept"/>


        <link:calculationArc order="1.0" weight="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item" xlink:from="example_GrossProfitConcept" xlink:to="example_RevenueConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_CostOfRevenueConcept" xlink:label="example_CostOfRevenueConcept"/>


        <link:calculationArc order="1.0" weight="-1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item" xlink:from="example_GrossProfitConcept" xlink:to="example_CostOfRevenueConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_NetProfitConcept" xlink:label="example_NetProfitConcept"/>


        <link:calculationArc order="1.0" weight="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item" xlink:from="example_NetProfitConcept" xlink:to="example_GrossProfitConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ExpensesConcept" xlink:label="example_ExpensesConcept"/>


        <link:calculationArc order="1.0" weight="-1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item" xlink:from="example_NetProfitConcept" xlink:to="example_ExpensesConcept"/>


    </link:calculationLink>


</link:linkbase>

Calculation linkbase relevant components can be analyzed as follows:

3.6.5.4.1 roleRef

Element <roleRef> references the <roleType> declaration in the schema and is repeated for each roleType declared, following is the `roleRef`` from our example:

tag roleURI type href description
roleRef http://xyz.abc/role/IncomeStatement simple is.xsd#roleType_IncomeStatement See roleType
3.6.5.4.2 Relations (arcs)

The root element in case of calculation relationship is usually the grand total of all other calculations, in our Income Statement the root element is Net Profit for linkrole http://xyz.abc/role/IncomeStatement, the network can be described in a table as follows (@from and @to refers to locators ids):

tag order weight type arcrole from to
calculationArc 1.0 1.0 arc http://www.xbrl.org/2003/arcrole/summation-item example_GrossProfitConcept example_RevenueConcept
calculationArc 1.0 -1.0 arc http://www.xbrl.org/2003/arcrole/summation-item example_GrossProfitConcept example_CostOfRevenueConcept
calculationArc 1.0 1.0 arc http://www.xbrl.org/2003/arcrole/summation-item example_NetProfitConcept example_GrossProfitConcept
calculationArc 1.0 -1.0 arc http://www.xbrl.org/2003/arcrole/summation-item example_NetProfitConcept example_ExpensesConcept

Notes

  • <calculationArc> is used to establish calculation relationships in a calculation network.
  • summation-item arcrole is used for calculation relationship
  • @weight is used on calculationArc to determine if this concept is to be added (@weight=1.0) or subtracted (@weight=-1.0), not also that the core concept @balance is used in conjunction with the @weight to determine the appropriate arithmetic operation.
  • @order is used on calculationArc to determine the order of appearance of concept when the calculation relationship is presented.
3.6.5.4.3 Hierarchical View

A hierarchical view of presentation link (Concepts labels are used):

Concept Label* Weight Balance depth
10000 - Statement - Income Statement Container
Net Profit credit Root
(1) Gross Profit 1.0 credit 1
(1) Revenue 1.0 credit 2
(-1) Cost of Revenue -1.0 debit 2
(-1) Expenses -1.0 debit 1
* Concepts preferred labels are used in this table

3.6.5.5 Label linkbase

Label linkbase is an example of Resource Link, it is used to create relationships between concepts and their labels, label here is the Resource. Each concept can have multiple labels describing the concept in different roles, for example beginning balance or ending balance also a concept can have labels in multiple languages.

Label link uses <labelArc> to link a concept to its labels, and uses @arcrole http://www.xbrl.org/2003/arcrole/concept-label.

3.6.5.5.1 Label Roles

Each label (the resource) is defined using the element <label> form namespace {http://www.xbrl.org/2003/linkbase}. The @role and @xml:lang attributes on the <label> element are used to identify the role of the label and its language. XBRL specifications specify some standard label roles, some of them are as follows:

role meaning
Omitted role attribute OR http://www.xbrl.org/2003/role/label Standard label for a Concept.
http://www.xbrl.org/2003/role/terseLabel Short label for a Concept, often omitting text that should be inferable when the concept is reported in the context of other related concepts.
http://www.xbrl.org/2003/role/verboseLabel Extended label for a Concept, making sure not to omit text that is required to enable the label to be understood on a stand alone basis.
http://www.xbrl.org/2003/role/totalLabel The label for a Concept for use in presenting values associated with the concept when it is being reported as the total of a set of other values.
http://www.xbrl.org/2003/role/periodStartLabel http://www.xbrl.org/2003/role/periodEndLabel http://www.xbrl.org/2003/role/periodEndLabel The label for a Concept with periodType="instant" for use in presenting values associated with the concept when it is being reported as a start (end) of period value.
http://www.xbrl.org/2003/role/documentation Documentation of a Concept, providing an explanation of its meaning and its appropriate usage and any other documentation deemed necessary.
... ...

For the full list of roles (See XBRL Specifications Table 8).

In this example the English labels and Arabic labels are stored in separate files (is_lab_en.xml and is_lab_ar.xml), files displayed below:

Arabic linkbase XML file:

<?xml version="1.0" encoding="utf-8"?>


<link:linkbase 


      xmlns:xlink="http://www.w3.org/1999/xlink" 


      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 


      xmlns:link="http://www.xbrl.org/2003/linkbase"


      xmlns:label="http://xbrl.org/2008/label"


      xsi:schemaLocation="


      http://www.w3.org/1999/xlink http://www.xbrl.org/2003/xlink-2003-12-31.xsd


      http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd





      " 


      >


    <link:labelLink xlink:type="extended" xlink:role="http://www.xbrl.org/2003/role/link">


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementConceptAbstract" xlink:label="example_IncomeStatementConceptAbstract"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_IncomeStatementConceptAbstract" xlink:to="label_example_IncomeStatementConceptAbstract"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_IncomeStatementConceptAbstract" xml:lang="ar"><U+0642><U+0627><U+0626><U+0645><U+0629> <U+0627><U+0644><U+062F><U+062E><U+0644> [<U+0645><U+0644><U+062E><U+0635>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementTable" xlink:label="example_IncomeStatementTable"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_IncomeStatementTable" xlink:to="label_example_IncomeStatementTable"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_IncomeStatementTable" xml:lang="ar"><U+0642><U+0627><U+0626><U+0645><U+0629> <U+0627><U+0644><U+062F><U+062E><U+0644> [<U+062C><U+062F><U+0648><U+0644>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceAxis" xlink:label="example_ProductServiceAxis"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ProductServiceAxis" xlink:to="label_example_ProductServiceAxis"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ProductServiceAxis" xml:lang="ar"><U+0645><U+0646><U+062A><U+062C><U+0627><U+062A> <U+0648><U+062E><U+062F><U+0645><U+0627><U+062A> [<U+0645><U+062D><U+0648><U+0631>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceDomain" xlink:label="example_ProductServiceDomain"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ProductServiceDomain" xlink:to="label_example_ProductServiceDomain"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ProductServiceDomain" xml:lang="ar"><U+0645><U+0646><U+062A><U+062C><U+0627><U+062A> <U+0648><U+062E><U+062F><U+0645><U+0627><U+062A> [<U+0646><U+0637><U+0627><U+0642>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductMember" xlink:label="example_ProductMember"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ProductMember" xlink:to="label_example_ProductMember"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ProductMember" xml:lang="ar"><U+0645><U+0646><U+062A><U+062C><U+0627><U+062A> [<U+0639><U+0636><U+0648>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ServiceMember" xlink:label="example_ServiceMember"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ServiceMember" xlink:to="label_example_ServiceMember"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ServiceMember" xml:lang="ar"><U+062E><U+062F><U+0645><U+0627><U+062A> [<U+0639><U+0636><U+0648>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_StatementLineItems" xlink:label="example_StatementLineItems"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_StatementLineItems" xlink:to="label_example_StatementLineItems"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_StatementLineItems" xml:lang="ar"><U+0642><U+0627><U+0626><U+0645><U+0629> [<U+0628><U+0646><U+0648><U+062F>]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_RevenueConcept" xlink:label="example_RevenueConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_RevenueConcept" xlink:to="label_example_RevenueConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_RevenueConcept" xml:lang="ar"><U+0627><U+064A><U+0631><U+0627><U+062F><U+0627><U+062A></link:label>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/totalLabel" xlink:label="label_example_RevenueConcept" xml:lang="ar"><U+0627><U+062C><U+0645><U+0627><U+0644><U+064A> <U+0627><U+0644><U+0627><U+064A><U+0631><U+0627><U+062F><U+0627><U+062A></link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_CostOfRevenueConcept" xlink:label="example_CostOfRevenueConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_CostOfRevenueConcept" xlink:to="label_example_CostOfRevenueConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_CostOfRevenueConcept" xml:lang="ar"><U+062A><U+0643><U+0644><U+0641><U+0629> <U+0627><U+0644><U+0627><U+064A><U+0631><U+0627><U+062F><U+0627><U+062A></link:label>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/totalLabel" xlink:label="label_example_CostOfRevenueConcept" xml:lang="ar"><U+0627><U+062C><U+0645><U+0627><U+0644><U+064A> <U+062A><U+0643><U+0644><U+0641><U+0629> <U+0627><U+0644><U+0627><U+064A><U+0631><U+0627><U+062F><U+0627><U+062A></link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_GrossProfitConcept" xlink:label="example_GrossProfitConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_GrossProfitConcept" xlink:to="label_example_GrossProfitConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_GrossProfitConcept" xml:lang="ar"><U+0645><U+062C><U+0645><U+0644> <U+0627><U+0644><U+0631><U+0628><U+062D></link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ExpensesConcept" xlink:label="example_ExpensesConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ExpensesConcept" xlink:to="label_example_ExpensesConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ExpensesConcept" xml:lang="ar"><U+062A><U+0643><U+0627><U+0644><U+064A><U+0641></link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_NetProfitConcept" xlink:label="example_NetProfitConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_NetProfitConcept" xlink:to="label_example_NetProfitConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_NetProfitConcept" xml:lang="ar"><U+0635><U+0627><U+0641><U+064A> <U+0627><U+0644><U+0631><U+0628><U+062D></link:label>


    <link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_EarningPerShareConcept" xlink:to="label_example_EarningPerShareConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_EarningPerShareConcept" xlink:label="example_EarningPerShareConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_EarningPerShareConcept" xml:lang="ar"><U+0631><U+0628><U+062D> <U+0627><U+0644><U+0633><U+0647><U+0645></link:label>


    <link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_SharesOutstandingConcept" xlink:to="label_example_SharesOutstandingConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_SharesOutstandingConcept" xlink:label="example_SharesOutstandingConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_SharesOutstandingConcept" xml:lang="ar"><U+0627><U+0644><U+0627><U+0633><U+0647><U+0645> <U+0627><U+0644><U+0645><U+062A><U+062F><U+0627><U+0648><U+0644><U+0629></link:label>


    </link:labelLink>


</link:linkbase>

English linkbase XML file:

<?xml version="1.0" encoding="utf-8"?>


<link:linkbase xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:link="http://www.xbrl.org/2003/linkbase">


    <link:labelLink xlink:type="extended" xlink:role="http://www.xbrl.org/2003/role/link">


        <link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_EarningPerShareConcept" xlink:to="label_example_EarningPerShareConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_EarningPerShareConcept" xlink:label="example_EarningPerShareConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_EarningPerShareConcept" xml:lang="en">Earnings Per Share</link:label>


        <link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_SharesOutstandingConcept" xlink:to="label_example_SharesOutstandingConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_SharesOutstandingConcept" xlink:label="example_SharesOutstandingConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_SharesOutstandingConcept" xml:lang="en">Shares Outstanding</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementConceptAbstract" xlink:label="example_IncomeStatementConceptAbstract"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_IncomeStatementConceptAbstract" xlink:to="label_example_IncomeStatementConceptAbstract"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_IncomeStatementConceptAbstract" xml:lang="en">Income Statement [Abstract]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementTable" xlink:label="example_IncomeStatementTable"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_IncomeStatementTable" xlink:to="label_example_IncomeStatementTable"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_IncomeStatementTable" xml:lang="en">Income Statement [Table]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceAxis" xlink:label="example_ProductServiceAxis"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ProductServiceAxis" xlink:to="label_example_ProductServiceAxis"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ProductServiceAxis" xml:lang="en">Product And Service [Axis]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceDomain" xlink:label="example_ProductServiceDomain"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ProductServiceDomain" xlink:to="label_example_ProductServiceDomain"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ProductServiceDomain" xml:lang="en">Product And Service [Domain]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductMember" xlink:label="example_ProductMember"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ProductMember" xlink:to="label_example_ProductMember"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ProductMember" xml:lang="en">Product [Member]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ServiceMember" xlink:label="example_ServiceMember"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ServiceMember" xlink:to="label_example_ServiceMember"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ServiceMember" xml:lang="en">Service [Member]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_StatementLineItems" xlink:label="example_StatementLineItems"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_StatementLineItems" xlink:to="label_example_StatementLineItems"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_StatementLineItems" xml:lang="en">Statement [Line Items]</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_RevenueConcept" xlink:label="example_RevenueConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_RevenueConcept" xlink:to="label_example_RevenueConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_RevenueConcept" xml:lang="en">Revenue</link:label>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/totalLabel" xlink:label="label_example_RevenueConcept" xml:lang="en">Total Revenues</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_CostOfRevenueConcept" xlink:label="example_CostOfRevenueConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_CostOfRevenueConcept" xlink:to="label_example_CostOfRevenueConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_CostOfRevenueConcept" xml:lang="en">Cost of Revenue</link:label>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/totalLabel" xlink:label="label_example_CostOfRevenueConcept" xml:lang="en">Total Costs of Revenues</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_GrossProfitConcept" xlink:label="example_GrossProfitConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_GrossProfitConcept" xlink:to="label_example_GrossProfitConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_GrossProfitConcept" xml:lang="en">Gross Profit</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ExpensesConcept" xlink:label="example_ExpensesConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_ExpensesConcept" xlink:to="label_example_ExpensesConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_ExpensesConcept" xml:lang="en">Expenses</link:label>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_NetProfitConcept" xlink:label="example_NetProfitConcept"/>


        <link:labelArc order="1.0" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="example_NetProfitConcept" xlink:to="label_example_NetProfitConcept"/>


        <link:label xlink:type="resource" xlink:role="http://www.xbrl.org/2003/role/label" xlink:label="label_example_NetProfitConcept" xml:lang="en">Net Profit</link:label>


    </link:labelLink>


</link:linkbase>
3.6.5.5.2 roleRef

Element <roleRef> is not used in this case of label link because we do not need to partition the label links by roles (we can do that but was not done in this case), instead the default standard link role http://www.xbrl.org/2003/role/link was used on the labelLink element.

Since label link is a resource link, it does not have a root element, it just links the concept to the resources.

3.6.5.5.3 Label Resources

Table showing label resource declarations:

tag type role label lang Label
label resource http://www.xbrl.org/2003/role/label label_example_EarningPerShareConcept en Earnings Per Share
label resource http://www.xbrl.org/2003/role/label label_example_SharesOutstandingConcept en Shares Outstanding
label resource http://www.xbrl.org/2003/role/label label_example_IncomeStatementConceptAbstract en Income Statement [Abstract]
label resource http://www.xbrl.org/2003/role/label label_example_IncomeStatementTable en Income Statement [Table]
label resource http://www.xbrl.org/2003/role/label label_example_ProductServiceAxis en Product And Service [Axis]
label resource http://www.xbrl.org/2003/role/label label_example_ProductServiceDomain en Product And Service [Domain]
label resource http://www.xbrl.org/2003/role/label label_example_ProductMember en Product [Member]
label resource http://www.xbrl.org/2003/role/label label_example_ServiceMember en Service [Member]
label resource http://www.xbrl.org/2003/role/label label_example_StatementLineItems en Statement [Line Items]
label resource http://www.xbrl.org/2003/role/label label_example_RevenueConcept en Revenue
label resource http://www.xbrl.org/2003/role/totalLabel label_example_RevenueConcept en Total Revenues
label resource http://www.xbrl.org/2003/role/label label_example_CostOfRevenueConcept en Cost of Revenue
label resource http://www.xbrl.org/2003/role/totalLabel label_example_CostOfRevenueConcept en Total Costs of Revenues
label resource http://www.xbrl.org/2003/role/label label_example_GrossProfitConcept en Gross Profit
label resource http://www.xbrl.org/2003/role/label label_example_ExpensesConcept en Expenses
label resource http://www.xbrl.org/2003/role/label label_example_NetProfitConcept en Net Profit

Notes

  • Arabic Labels are not shown here due to encoding issues, please see file ~/xml_files/incomeStatementExample/is_lab_ar.xml.
  • @lang is used to specify the language of the label, this will help switching between label languages in any XBRL processor.
  • @role is used to specify label role, one concept can have many labels but each label should have unique label role.

3.6.5.6 Definition linkbase

Definition Link is used to define relations between pairs of concepts that goes beyond calculation or presentation links. Element <definitionLink> is used to define the a definition network for a linkrRole specified by @role attribute of the <definitionLink> element, <definitionArc> is used to establish the relation between the concepts pairs for the relation specified by the @role attribute of the <definitionArc> element.

XBRL specifications defines some standard definition arcRoles (see XBRL specification section 5.2.6.2), and here are the definitions from THD section 3.4.4.3:

  1. General-special - This relationship indicates that one concept of a pair is a more specialized form of another concept. For instance, in the widget example, the widget type AngularWidgets can be general (referring to any widget type that has angles), while the widget type TriangularWidgets is more specific.
  2. Essence-alias - This relationship indicates that one concept of a pair essentially has the same meaning as the other concept. For example, one reporting entity may use the concept Widgets to refer to its product, and another may prefer the concept Gizmos, but the underlying meaning, that these concepts are products, is the same. The essence-alias definition reflects a change in terminology rather than semantic meaning.
  3. Requires-element - This relationship indicates that the value of one concept is required when the value of the other concept in the pair is present. For example, in the widget report with both concept core dimensions WidgetsSold and PricePerWidget, PricePerWidget requires a value for WidgetsSold.
  4. Similar-tuples - This relationship is operationally the same as the essence-alias definition but reserved for usage with tuples. Tuples are not commonly used.

Additionally, the XBRL Dimensions Specification allows for more definition types. These types are used to define the relationships pertaining to the components of a dimension in XBRL. The definitions exist between a concept and a taxonomy-defined dimension to define the hierarchical relationship between them. Examples of each can be seen in Figure 3-10.

  1. Dimension-default - This relationship indicates that the concept is the default value for the taxonomy-defined dimension.
  2. Dimension-domain - This relationship indicates that the concept represents the domain of the taxonomy-defined dimension.
  3. Domain-member - This relationship indicates that one concept is a member of the domain of the other concept that is part of a taxonomy-defined dimension. This relationship can exist between many concepts. For example, a Northeast member may belong to a GeographicLocation axis, but comprising this Northeast member is a group of northeastern states in the US. These each have the domain-member relationship with the Northeast concept.

In addition to the above, XBRL Dimensions Specifications defines the following relations:

  • all and notAll: together also referred to as has hypercube is a relation between a primary item declaration and a hypercube item, the all relations means that the primary item can be used with all the dimensions included in the hypercube, notAll means that the primary item cannot be used with any dimension in the hypercube. In addition to defining dimensional relation

  • The @closed attribute of a hypercube that takes a true/false value, if true it specifies that all taxonomy-defined dimensions in the hypercube must intersect on a fact in order for that fact to be part of the hypercube, if false any of the taxonomy-defined dimensions in the hypercube can intersect on a fact in order for that fact to be part of the hypercube.

  • hypercube-dimension a relation between a hypercube and a dimension.

  • Sometimes authors of an extension taxonomy may want to prohibit the use of some primary items from imported taxonomy, one of the ways this done is by linking the prohibited items to an empty hypercube (a hypercube with one dimension that doesnot have any members).

In our example, definition linkbase contains only dimensional relationship to create the income statement table with Product And Service dimensions.

Definition linkbase XML file:

<?xml version="1.0" encoding="utf-8"?>


<link:linkbase xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:xbrldt="http://xbrl.org/2005/xbrldt">


    <link:roleRef roleURI="http://xyz.abc/role/IncomeStatement" xlink:type="simple" xlink:href="is.xsd#roleType_IncomeStatement"/>


    <link:roleRef roleURI="http://xyz.abc/role/BlockedConceptsSegment" xlink:type="simple" xlink:href="is.xsd#BlockedConceptsSegmentRole"/>


    <link:arcroleRef arcroleURI="http://xbrl.org/int/dim/arcrole/hypercube-dimension" xlink:type="simple" xlink:href="http://www.xbrl.org/2005/xbrldt-2005.xsd#hypercube-dimension"/>


    <link:arcroleRef arcroleURI="http://xbrl.org/int/dim/arcrole/dimension-domain" xlink:type="simple" xlink:href="http://www.xbrl.org/2005/xbrldt-2005.xsd#dimension-domain"/>


    <link:arcroleRef arcroleURI="http://xbrl.org/int/dim/arcrole/domain-member" xlink:type="simple" xlink:href="http://www.xbrl.org/2005/xbrldt-2005.xsd#domain-member"/>


    <link:arcroleRef arcroleURI="http://xbrl.org/int/dim/arcrole/all" xlink:type="simple" xlink:href="http://www.xbrl.org/2005/xbrldt-2005.xsd#all"/>


    <link:arcroleRef arcroleURI="http://xbrl.org/int/dim/arcrole/dimension-default" xlink:type="simple" xlink:href="http://www.xbrl.org/2005/xbrldt-2005.xsd#dimension-default"/>


    <link:definitionLink xlink:type="extended" xlink:role="http://xyz.abc/role/IncomeStatement">


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementConceptAbstract" xlink:label="example_IncomeStatementConceptAbstract"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_StatementLineItems" xlink:label="example_StatementLineItems"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_IncomeStatementConceptAbstract" xlink:to="example_StatementLineItems"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_IncomeStatementTable" xlink:label="example_IncomeStatementTable"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/all" xlink:from="example_StatementLineItems" xlink:to="example_IncomeStatementTable" xbrldt:closed="true" xbrldt:contextElement="segment"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceAxis" xlink:label="example_ProductServiceAxis"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/hypercube-dimension" xlink:from="example_IncomeStatementTable" xlink:to="example_ProductServiceAxis"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceDomain" xlink:label="example_ProductServiceDomain"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/dimension-domain" xlink:from="example_ProductServiceAxis" xlink:to="example_ProductServiceDomain"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductMember" xlink:label="example_ProductMember"/>


        <link:definitionArc order="2.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_ProductServiceDomain" xlink:to="example_ProductMember"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ServiceMember" xlink:label="example_ServiceMember"/>


        <link:definitionArc order="3.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_ProductServiceDomain" xlink:to="example_ServiceMember"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_RevenueConcept" xlink:label="example_RevenueConcept"/>


        <link:definitionArc order="2.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_StatementLineItems" xlink:to="example_RevenueConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_CostOfRevenueConcept" xlink:label="example_CostOfRevenueConcept"/>


        <link:definitionArc order="3.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_StatementLineItems" xlink:to="example_CostOfRevenueConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_GrossProfitConcept" xlink:label="example_GrossProfitConcept"/>


        <link:definitionArc order="4.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_StatementLineItems" xlink:to="example_GrossProfitConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ExpensesConcept" xlink:label="example_ExpensesConcept"/>


        <link:definitionArc order="5.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_StatementLineItems" xlink:to="example_ExpensesConcept"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_NetProfitConcept" xlink:label="example_NetProfitConcept"/>


        <link:definitionArc order="6.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_StatementLineItems" xlink:to="example_NetProfitConcept"/>


    </link:definitionLink>


    <link:definitionLink xlink:type="extended" xlink:role="http://xyz.abc/role/IncomeStatement">


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceAxis" xlink:label="example_ProductServiceAxis"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_ProductServiceDomain" xlink:label="example_ProductServiceDomain"/>


        <link:definitionArc order="3.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/dimension-default" xlink:from="example_ProductServiceAxis" xlink:to="example_ProductServiceDomain"/>


    </link:definitionLink>


    <!-- To test concept blocking -->


    <!-- <link:definitionLink xlink:type="extended" xlink:role="http://xyz.abc/role/BlockedConceptsSegment">


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_BlockedLineItemsAbstract" xlink:label="example_BlockedLineItemsAbstract"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_BlockedLineItemsTable" xlink:label="example_BlockedLineItemsTable"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_EmptyAxis" xlink:label="example_EmptyAxis"/>


        <link:loc xlink:type="locator" xlink:href="is.xsd#example_BlockedConcept" xlink:label="example_BlockedConcept"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/all" xlink:from="example_BlockedLineItemsAbstract" xlink:to="example_BlockedLineItemsTable" xbrldt:closed="true" xbrldt:contextElement="segment"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/hypercube-dimension" xlink:from="example_BlockedLineItemsTable" xlink:to="example_EmptyAxis"/>


        <link:definitionArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/int/dim/arcrole/domain-member" xlink:from="example_BlockedLineItemsAbstract" xlink:to="example_BlockedConcept"/>


    </link:definitionLink> -->


</link:linkbase>
3.6.5.6.1 roleRef and arcroleRef

Element <roleRef> references the <roleType> declaration in the schema and is repeated for each roleType declared, following is the `roleRef`` from our example:

tag roleURI type href arcroleURI
roleRef http://xyz.abc/role/IncomeStatement simple is.xsd#roleType_IncomeStatement NA
roleRef http://xyz.abc/role/BlockedConceptsSegment simple is.xsd#BlockedConceptsSegmentRole NA
arcroleRef NA simple http://www.xbrl.org/2005/xbrldt-2005.xsd#hypercube-dimension http://xbrl.org/int/dim/arcrole/hypercube-dimension
arcroleRef NA simple http://www.xbrl.org/2005/xbrldt-2005.xsd#dimension-domain http://xbrl.org/int/dim/arcrole/dimension-domain
arcroleRef NA simple http://www.xbrl.org/2005/xbrldt-2005.xsd#domain-member http://xbrl.org/int/dim/arcrole/domain-member
arcroleRef NA simple http://www.xbrl.org/2005/xbrldt-2005.xsd#all http://xbrl.org/int/dim/arcrole/all
arcroleRef NA simple http://www.xbrl.org/2005/xbrldt-2005.xsd#dimension-default http://xbrl.org/int/dim/arcrole/dimension-default

Note arcroleRef is used to reference arcroles declared in XBRL Dimensions specifications.

3.6.5.6.2 Relations (arcs)

In this example only relations from XBRL dimensions are used in the definition linkbase for the linkrole http://xyz.abc/role/IncomeStatement. The dimensional relations are somewhat similar to presentation relations in form, but with different processing instructions. The root element is also Income Statement [Abstract] that is meant to group together all Income statement hypercubes, the network can be described in a table as follows (@from and @to refers to locators ids):

tag order type arcrole from to closed contextElement
definitionArc 1.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_IncomeStatementConceptAbstract example_StatementLineItems NA NA
definitionArc 1.0 arc http://xbrl.org/int/dim/arcrole/hypercube-dimension example_IncomeStatementTable example_ProductServiceAxis NA NA
definitionArc 1.0 arc http://xbrl.org/int/dim/arcrole/dimension-domain example_ProductServiceAxis example_ProductServiceDomain NA NA
definitionArc 3.0 arc http://xbrl.org/int/dim/arcrole/dimension-default example_ProductServiceAxis example_ProductServiceDomain NA NA
definitionArc 2.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_ProductServiceDomain example_ProductMember NA NA
definitionArc 3.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_ProductServiceDomain example_ServiceMember NA NA
definitionArc 1.0 arc http://xbrl.org/int/dim/arcrole/all example_StatementLineItems example_IncomeStatementTable true segment
definitionArc 2.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_StatementLineItems example_RevenueConcept NA NA
definitionArc 3.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_StatementLineItems example_CostOfRevenueConcept NA NA
definitionArc 4.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_StatementLineItems example_GrossProfitConcept NA NA
definitionArc 5.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_StatementLineItems example_ExpensesConcept NA NA
definitionArc 6.0 arc http://xbrl.org/int/dim/arcrole/domain-member example_StatementLineItems example_NetProfitConcept NA NA

Notes

  • <definitionArc> is used to establish dimensional relationships.
  • arcroles used are defined in XBRL Dimensions specifications.
  • @closed and @contexElement on <definitionArc> relation between example_StatementLineItems and example_IncomeStatementTable with role http://xbrl.org/int/dim/arcrole/all are used to specify that all taxonomy-defined dimensions in the hypercube must intersect on a fact in order for that fact to be part of the hypercube, and the dimensions must be segment dimensions (i.e. linked through context segment).
  • @order is used on definitionArc to determine the order of appearance of concept when presented.
3.6.5.6.3 Hierarchical View

A hierarchical view of presentation link (Concepts labels are used):

Concept Label* arcrole depth
10000 - Statement - Income Statement Container
Income Statement [Abstract] Root
Statement [Line Items] domain-member 1
Income Statement [Table] all 2
Product And Service [Axis] hypercube-dimension 3
Product And Service [Domain] dimension-domain 4
Product [Member] domain-member 5
Service [Member] domain-member 5
Revenue domain-member 2
Cost of Revenue domain-member 2
Gross Profit domain-member 2
Expenses domain-member 2
Net Profit domain-member 2
* Concepts preferred labels are used in this table

3.6.5.7 Instance Document

Instance document is where current report data is reported using XBRL syntax (see section 3.7.3.4). In our example we can analyze the components of our instance document as follows:

3.6.5.7.1 References

In our example, the instance document has only on reference <schemaRef>, whih is a mandatory element that must exist atleast once as child to <xbrl> element.

tag href type
schemaRef is.xsd simple
3.6.5.7.2 contexts

As mentioned, <context> is an element used only in XBRL instance document, it acts as a container for some core dimension and taxonomy defined dimensions, and it is referenced by facts in an instance document to give contextual meaning to the fact.

In our example, following contexts were defined in the instance document:

tag id Entity Identifier Entity Identifier Schema Entity Segment Dim Entity Segment Member Period startDate Period endDate Period Instant
context c-01 Example-IS http://www.any.gov/identifier NA NA 2020-01-01 2020-12-30 NA
context c-02 Example-IS http://www.any.gov/identifier example:ProductServiceAxis example:ProductMember 2020-01-01 2020-12-30 NA
context c-03 Example-IS http://www.any.gov/identifier example:ProductServiceAxis example:ServiceMember 2020-01-01 2020-12-30 NA
context c-04 Example-IS http://www.any.gov/identifier NA NA 2019-01-01 2019-12-30 NA
context c-05 Example-IS http://www.any.gov/identifier example:ProductServiceAxis example:ProductMember 2019-01-01 2019-12-30 NA
context c-06 Example-IS http://www.any.gov/identifier example:ProductServiceAxis example:ServiceMember 2019-01-01 2019-12-30 NA
context c-07 Example-IS http://www.any.gov/identifier NA NA NA NA 2020-12-31
context c-08 Example-IS http://www.any.gov/identifier NA NA NA NA 2019-12-31

Notes
* Each context must have unique ID.
* Each context must contain one <entity> element that identifies the reporting entity, <entity> element may contain a segment element that references a dimension and a domain member for dimensional relations.
* Each context must have a <period> element that identifies the instant or duration for a reported fact, also note there is a period type forever used for facts that do not have a specific period dimension, for example, the name of the founder of a company can be a fact that does not have specific period.

3.6.5.7.3 Units

XBRL specification requires all numeric facts to have a unit of measurement (see XBRL specifications section 4.6.2). In our instance document, following units were declared to be referenced by facts:

tag id measure Divide Numerator Divide Denominator
unit u-01 iso4217:EGP NA NA
unit u-02 NA iso4217:EGP shares
unit u-03 shares NA NA

Note: The unit referenced by a fact needs to be compatible with the the type of that fact, for example EarningsPerShare concept will usually have a perShareItemType and the unit should be a per share also.

3.6.5.7.4 Facts

Details of facts in the instance is as follows:

tag contextRef decimals id unitRef value
RevenueConcept c-01 2 facts.r_f001.value u-01 5000
RevenueConcept c-02 2 facts.r_f002.value u-01 2000
RevenueConcept c-03 2 facts.r_f003.value u-01 3000
CostOfRevenueConcept c-01 2 facts.r_f004.value u-01 3000
CostOfRevenueConcept c-02 2 facts.r_f005.value u-01 1000
CostOfRevenueConcept c-03 2 facts.r_f006.value u-01 2000
GrossProfitConcept c-01 2 facts.r_f007.value u-01 2000
GrossProfitConcept c-02 2 facts.r_f008.value u-01 1000
GrossProfitConcept c-03 2 facts.r_f009.value u-01 1000
ExpensesConcept c-01 2 facts.r_f010.value u-01 500
NetProfitConcept c-01 2 facts.r_f011.value u-01 1500
RevenueConcept c-04 2 facts.r_f012.value u-01 4000
RevenueConcept c-05 2 facts.r_f013.value u-01 2500
RevenueConcept c-06 2 facts.r_f014.value u-01 1500
CostOfRevenueConcept c-04 2 facts.r_f015.value u-01 2250
CostOfRevenueConcept c-05 2 facts.r_f016.value u-01 1250
CostOfRevenueConcept c-06 2 facts.r_f017.value u-01 1000
GrossProfitConcept c-04 2 facts.r_f018.value u-01 1750
GrossProfitConcept c-05 2 facts.r_f019.value u-01 1250
GrossProfitConcept c-06 2 facts.r_f020.value u-01 500
ExpensesConcept c-04 2 facts.r_f021.value u-01 420
NetProfitConcept c-04 2 facts.r_f022.value u-01 1330

Notes of fact attributes @decimal and @precision:

A Numeric Item MUST have either a @precision attribute or a @decimals attribute unless it is of the fractionItemType or of a type that is derived by restriction from fractionItemType or has a nil value, in which case, it MUST NOT have either a @precision attribute or a @decimals attribute.
  • @decimal: This attribute MUST be an integer or the value “INF” that specifies the number of decimal places to which the value of the fact represented may be considered accurate, possibly as a result of rounding or truncation, a negative integer means that the value is truncated, for example if @decimal=-6 then the value is in Millions. (See XBRL Specifications 4.6.5).
  • @precision: This attribute MUST be a non-negative integer or the string “INF” that conveys the arithmetic precision of a measurement. If a numeric fact has a @precision attribute that has the value “n” then it is correct to “n” significant figures (See XBRL Specifications 4.6.4).

Also see support recommendation for precision and decimal.

3.6.6 XBRL Validation

3.6.6.1 Validation in XBRL Specification

XBRL Specifications requires that XBRL Instance, XBRL Linkbases and XBRL Taxonomy Schema must comply with the specifications, and this compliance is ensured through Validation process XBRL specifications section 3.4.

Many of XBRL syntax is expressed using XML Schema, as a result, a part of the validation process can be performed using XML Schema validation, other parts must be handled by other validation technologies.

3.6.6.2 Two layers of validation

Generally speaking there are two layers of validation, Basic Validation and Business Rules validation (terminology may differ here, but meaning will remains the same).

3.6.6.2.1 Basic Vaildation

Checks for syntax and XBRL specifications rules compliance, the basic validation rules will be the same in all situations, since it just checking for compliance with XBRL specifications. Basic validation includes many facets as follows:

  • Syntax Validation: Checks if validity of format and validity against a schema.
  • Data Type Validation: checks the data type of the value matches the data type of its concept core dimension. For example, ensuring that strings are not reported against concepts which should take numeric values.
  • Concept Relationship-based Validation: These are validation based on XBRL links, as described in TDH section 6.1.3 page 87:
These include, but are not limited to, relationships defined by calculation, definition, and presentation linkbases. The relationship arcs connecting concepts can aid developers (and preparers) in ensuring both the semantic logic of the relationship and that the concepts involved are used properly.
3.6.6.2.2 Business Rules Validation

On the other hand Business Rules Validation checks for compliance with rules specific to the taxonomy, and those will differ depending on the taxonomy authors’ objectives and rules. This makes it necessary to come up with custom validations that checks for compliance with specific business rules.

Custom rule validation can be built into validation software, as an example, Arelle has multiple plugins that validates different sets of specific business rules, such as Edgar Filing Manual (EFM) rules (SEC rules), IFRS rules, Eurpean Banking Authority (EBA) rules, … etc.
Arelle Validation Options

Arelle Validation Options

XBRL provides standardized tools to help in setting custom rules, these are XBRL Formulae, and XULE (based on XBRL Formula specifications).

XBRL Formula
XBRL Formula specifications provide XBRL constructs that instructs XBRL processor to preform certain procedures on an XBRL Instance. TDH section 6.2.1 page 88 describes XBRL Formula as follows:

XBRL formulas provide a standardized method for defining validation rules for XBRL reports that go beyond what is provided through calculations and other concept relationships. Through formulas, the validation rules can be embedded in the taxonomy itself. This allows the taxonomy to be easily disseminated with its validation rules, which reduces the chance for preparers to misinterpret them or have difficulty locating them. XBRL formula rules are placed in their own linkbase, often termed the assertion or formula linkbase. XBRL software capable of reading and interpreting this linkbase can apply the rules and display the results to preparers.

So in addition to the linkbases we talked about previously, a taxonomy can have a Formula Linkbase. XBRL formula can do four things (four processing models):

  • Value assertion: Checks fact variable against some criteria, for example, Cash balance is greater than zero.
  • Existence Assertion: Checks for the existence for specific fact exist in an XBRL Instance, for example, when there is a rule to report a specific fact, such as company identification number.
  • Formula: Formulae are constructs in a formula linkbase that cause production of fact items, for example calculate liquidity ratio. This useful in data extraction from an instance document even though this is not the intended use of formula.
  • Consistency Assertion: A consistency assertion specifies how to determine whether an output fact, produced by the associated formula matches reported facts, for example is Liabilities $10 and Equity is $5, we expect Assets to be $15 (equality is determined within a tolerance margin).
Figures 2 and 3 in XBRL Formula Overview summarizes the processing models as follows:
Four processing models effects

Four processing models effects source XBRL Formula overview

Examples for each processing model

Examples for each processing model source XBRL Formula overview

IFRS Taxonomy is an example of a taxonomy that uses formula to validate custom rules for XBRL filings based on the IFRS Taxonomy. IFRS formula linkbase guide found here.

XULE
XULE is an expression syntax that allows the querying of XBRL reports and taxonomies using a XULE processor, it is described in [TDH section 6.2.2 page 99] as follows:

Developed by XBRL US, XULE is an expression syntax that allows the querying of XBRL reports and taxonomies using a XULE processor. The primary purpose of XULE is to provide a user-friendly syntax to query and manipulate XBRL data. This can be helpful in a multitude of ways, including aiding consumers in quickly extracting specific facts from reports and supporting developers in querying XBRL taxonomies to render them as open API schemas or as iXBRL forms.

Example of the syntax for XULE:

namespace http://xyz.abc/IncomeStatementExample

// Calculate gross margin by dimension
output gross-margin
$gross-profit=@GrossProfitConcept
$revenue = @RevenueConcept
$dims = $revenue.dimensions-explicit
$lab = if (length($dims.values.label(None,'en').text)>0)
         ($dims.values.label(None,'en').text)[1]
        else "Total"
        
// Print output
"Gross Margin for {$revenue.period} {$lab} = {round( $gross-profit / $revenue, 3 )}%"

// Query all facts with value more than EGP 2000
output big-facts
{@concept where $fact > 2000}

Full guide for XULE is available here.

3.6.7 XBRL Table Linkbase

XBRL Table Linkbase specifications provides a mechanism for taxonomy authors to define a tabular layout of facts. The resulting tables can be used for both presentation and data entry.

Table linkbase is logically similar to Presentation Linkbase but with a lot more features. It allows for a standard way for defining views of concepts defined in a taxonomy, as mentioned in the specification overvie:

Table linkbase enables the definition of tables with multiple axes. The components of these axes are not limited to individual items; instead, they can be defined in terms of a combination of dimensions, time period references, units, entities or any other property that can be used to identify the financial facts represented by taxonomies.

3.6.7.1 Table Models

Table linkbase specifications define 3 models Structural Model, Definition Model and layout model.Definition Model defines the content of a table in terms of concepts and aspects using relationships in DTS, it is transformed to Structural model through process of resolution, the syntax provides a direct description of the definition model. Structural Model defines how the the shape of the table in terms of hierarchical breakdowns of fact space, while layout Model is the direct representation of the structure and content.

The basic idea of XBRL Table is that it filters and presents facts in specific layout according to the table definition and structure.

Terms relevant for the XBRL table linkbase:

Fact Source: A fact source is a container for XBRL facts, for example it maybe an existing XBRL instance. Fact source of facts that are to be considered for inclusion in the table.

Domain of a Table: Is the restricted fact space defined by the combination of constraints from all of the table’s breakdowns, along with any additional global constraints specified using table filters.

Axis: An axis defines an ordered mapping of XBRL fact space onto a line.

  • The x-axis SHOULD be interpreted as a horizontal arrangement of columns in a table. Columns MAY be laid out from left to right, or right to left, according to the language conventions.
  • The y-axis SHOULD be interpreted as a vertical progression of rows in a table. Rows SHOULD be laid out from top to bottom.
  • The z-axis MAY be interpreted as multiple two-dimensional tables and MAY be laid out on a two-dimensional display by presenting each table in series or by supplying controls for the user to select the data to be presented.

Breakdown: A breakdown defines a logically distinct breakdown of the fact space by sets of constraints. A breakdown is modeled as an ordered tree of structural nodes. Each of these nodes contributes zero or more constraints to the breakdown.

  • A closed breakdown is defined as a breakdown whose sequence of constraint sets can be determined independently of the facts to be included.
  • An open breakdown is defined as a breakdown whose sequence of constraint sets changes dynamically with the facts included and thus cannot be completely determined without knowledge of those facts.

Structural Node: A structural node is a node in a breakdown tree. Each node contributes zero or more constraints to the breakdown.

  • A closed structural node is a structural node with constraints fully determined by its definition and the DTS.
  • An open structural node is a structural node that does not fully define aspect value constraints and does not necessarily have a one-to-one relationship with layout nodes produced during resolution.

Definition node: A definition node is a definition of zero or more structural nodes in the structural model.

  • A closed definition node is a definition node which resolves to one or more closed structural nodes.
  • An open definition node is a definition node which resolves to an open structural node.

Table: represents a breakdown of XBRL fact space for the purpose of defining a reference view of XBRL data.

  • A closed table is defined as a table that consists only of closed breakdowns.
  • An open table is defined as a table whose constituent breakdowns include at least one open breakdown.

3.6.7.2 Table linkbase components

Table linkbase define a table in terms of relationships between components defined in table linkbase. Table linkbase uses generic link as the container link, within the generic link, a table is defined using relationships arcs and elements defined in table linkbase.

The main logic of table linkbase, using link syntax, it creates a table, then links that table an x (rows) and y (columns) axes, each axis it then linked to a breakdown element, which acts a a container for filter elements that filters the facts to be shown in the table. This logic can be visualized as follows:

Following is a table linkbase that creates a table from the Income Statement example, the table memics exactly the income statement:

<?xml version="1.0"?>


<link:linkbase xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd http://xbrl.org/2008/generic http://www.xbrl.org/2008/generic-link.xsd http://xbrl.org/2014/table http://www.xbrl.org/2014/table.xsd http://xbrl.org/2008/label http://www.xbrl.org/2008/generic-label.xsd http://xbrl.org/2010/filter/concept-relation http://www.xbrl.org/2010/concept-relation-filter.xsd http://xbrl.org/2008/filter/dimension http://www.xbrl.org/2008/dimension-filter.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:gen="http://xbrl.org/2008/generic" xmlns:label="http://xbrl.org/2008/label" xmlns:table="http://xbrl.org/2014/table" xmlns:example="http://xyz.abc/IncomeStatementExample">


    <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2014/aspect-node-filter" xlink:type="simple" xlink:href="http://www.xbrl.org/2014/table.xsd#aspect-node-filter" />


    <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2014/definition-node-subtree" xlink:type="simple" xlink:href="http://www.xbrl.org/2014/table.xsd#definition-node-subtree" />


    <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2014/breakdown-tree" xlink:type="simple" xlink:href="http://www.xbrl.org/2014/table.xsd#breakdown-tree" />


    <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2014/table-filter" xlink:type="simple" xlink:href="http://www.xbrl.org/2014/table.xsd#table-filter" />


    <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2014/table-breakdown" xlink:type="simple" xlink:href="http://www.xbrl.org/2014/table.xsd#table-breakdown" />


    <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2008/element-label" xlink:type="simple" xlink:href="http://www.xbrl.org/2008/generic-label.xsd#element-label" />


    <link:roleRef roleURI="http://www.xbrl.org/2008/role/label" xlink:type="simple" xlink:href="http://www.xbrl.org/2008/generic-label.xsd#standard-label" />


    <link:roleRef roleURI="http://www.xbrl.org/2008/role/link" xlink:type="simple" xlink:href="http://www.xbrl.org/2008/generic-link.xsd#standard-link-role" />


    <gen:link xlink:type="extended" xlink:role="http://www.xbrl.org/2008/role/link">





        <!-- Create Table -->


        <table:table id="table" xlink:type="resource" xlink:label="table" />


        


        <!-- Create first  break down for y axis-->


        <table:breakdown id="y-axis-concepts" xlink:type="resource" xlink:label="y-axis-concepts" />


        


        <!-- Link break down to table  -->


        <table:tableBreakdownArc order="2.0" axis="y" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2014/table-breakdown" xlink:from="table" xlink:to="y-axis-concepts" />





        <!-- Create concept relation node for y axis (returns all parent-child relations for statementLineItems element) -->


        <table:conceptRelationshipNode id="conceptRelationshipNode" xlink:type="resource" xlink:label="conceptRelationshipNode">


            <table:relationshipSource>example:StatementLineItems</table:relationshipSource>


            <table:linkrole>http://xyz.abc/role/IncomeStatement</table:linkrole>


            <table:arcrole>http://www.xbrl.org/2003/arcrole/parent-child</table:arcrole>


            <table:formulaAxis>child</table:formulaAxis>


        </table:conceptRelationshipNode>





        <!-- Link concept relation node to y axis breakdown -->


        <table:breakdownTreeArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2014/breakdown-tree" xlink:from="y-axis-concepts" xlink:to="conceptRelationshipNode" />








        <!-- create another break down for x axis -->


        <table:breakdown id="x-axis-dims" parentChildOrder="children-first" xlink:type="resource" xlink:label="x-axis-dims" />


        


        <!-- Link table to x axis breakdown -->


        <table:tableBreakdownArc order="1.0" axis="x" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2014/table-breakdown" xlink:from="table" xlink:to="x-axis-dims" />





        <!-- Create dimension relation node to return ProductService Domain Members -->


        <table:dimensionRelationshipNode id="dimensionRelationshipNode" xlink:type="resource" xlink:label="dimensionRelationshipNode">


            <table:relationshipSource>example:ProductServiceDomain</table:relationshipSource>


            <table:linkrole>http://xyz.abc/role/IncomeStatement</table:linkrole>


            <table:dimension>example:ProductServiceAxis</table:dimension>


            <table:formulaAxis>descendant-or-self</table:formulaAxis>


        </table:dimensionRelationshipNode>





        <!-- Link dimension relation node to x axis breakdown -->


        <table:breakdownTreeArc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2014/breakdown-tree" xlink:from="x-axis-dims" xlink:to="dimensionRelationshipNode" />





        <!-- Create break down for z axis -->


        <table:breakdown id="z-axis-period" xlink:type="resource" xlink:label="z-axis-period" />


        <table:tableBreakdownArc order="3.0" axis="z" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2014/table-breakdown" xlink:from="table" xlink:to="z-axis-period" />





        <!-- Create aspect node to return periods for z axis -->


        <table:aspectNode id="aspectNode3" xlink:type="resource" xlink:label="aspectNode3">


            <table:periodAspect />


        </table:aspectNode>





        <!-- Link aspect node to z-axis breakdown -->


        <table:breakdownTreeArc order="2.0" use="optional" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2014/breakdown-tree" xlink:from="z-axis-period" xlink:to="aspectNode3" />





        <!-- Create labels -->


        <gen:arc order="2.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2008/element-label" xlink:from="y-axis-concepts" xlink:to="label1" />


        <label:label id="label1" xlink:type="resource" xlink:role="http://www.xbrl.org/2008/role/label" xlink:label="label1" xml:lang="en">Line Items</label:label>


        <gen:arc order="1.0" xlink:type="arc" xlink:arcrole="http://xbrl.org/arcrole/2008/element-label" xlink:from="table" xlink:to="label" />


        <label:label id="label" xlink:type="resource" xlink:role="http://www.xbrl.org/2008/role/label" xlink:label="label" xml:lang="en">Data Entry</label:label>





    </gen:link>


</link:linkbase>

When the income statement instance is loaded by arelle and a table is rendered as HTML, it the output is here.

3.6.8 Inline XBRL (iXBRL)

Inline XBRL specifications provide a mechanism for embedding XBRL tags in HTML documents (xHTML is required by the specifications). This allows the XBRL benefits of tagged data to be combined with a human-readable presentation of a report, which is under the control of the preparer.

The Inline XBRL Document Set is a group of one or more Inline XBRL Documents which when comprising sufficient metadata results in one or more Target Documents when transformed according to the mapping rules prescribed in inlineXBRL specifications.

In practical terms, inline XBRL specifications define XBRL elements in the namespace {http://www.xbrl.org/2013/inlineXBRL}, these elements are used from within xHTML and form the metadata necessary to describe an XBRL instance document which is referred to as Target Document, in this context a Target Document is defined as valid XBRL instance document represented by metadata in the Inline XBRL Document Set. The target document need not to physically exist, but the metadata must be sufficient to construct the target document when transformed according to the mapping rules prescribed in inline XBRL Specification.

Inline XBRL

Inline XBRL

3.6.8.1 Inline XBRL elements

As mentioned, XBRL and Inline XBRL instance documents are usually created using specialized software that takes care of the form and sytanx and provide tools to help authors, but it is important to have some knowledge of the elements defined within the specifications.

Inline XBRL specifications define elements in namespace {xi=http://www.xbrl.org/2013/inlineXBRL}:

element description
ix:continuation used to define data that is to be treated as part of ix:footnote or ix:nonNumeric.
ix:denominator denotes an XBRL denominator element; used with ix:fraction mapped element. see ix:fraction
ix:exclude used to encapsulate data that is to be excluded from the processing of ix:footnote or ix:nonNumeric elements, The purpose of the ix:exclude element is to prevent text content from being included in the {value} properties of ix:footnote or ix:nonNumeric. It has no other use.
ix:footnote represents the link:footnote element in XBRL instance,
ix:fraction denotes an XBRL fact which is an element of type, or derived from type, fractionItemType;
ix:header contains the non-displayed portions of the Target Document, it contains xi:hidden.
ix:hidden used to contain XBRL facts that are not to be displayed in the browser
ix:nonFraction element denotes an XBRL numeric item which is an element which is not of type, nor derived from type, fractionItemType.
ix:nonNumeric element denotes an XBRL non-numeric item
ix:numerator denotes an XBRL numerator element
ix:references used to contain reference elements which are required by a given Target Document (schemaRef, linbaseRef)
ix:relationship used to define relationships between XBRL facts or between XBRL facts and footnote resources. The type of relationship is indicated by the value of the arcrole attribute, such as http://www.xbrl.org/2009/arcrole/fact-explanatoryFact for fact to fact relationships
ix:resources used to contain resource elements which are required by one or more Target Documents (ix:relationship, link:roleRef, link:arcroleRef, xbrli:context, xbrli:unit)
ix:tuple denotes an XBRL tuple

The best way to understand what inline XBRL is, is actually to see it, below are three links to one and the same inline XBRL filing for Microsoft form 10-Q for the 9 months ended 2021-03-31:

3.6.8.2 Inline XBRL Transformations

Inline XBRL is embedded in a human readable document, which means that the values are also included in the the document in human readable form that might not comply with the data types formats required by XBRL specifications, XBRL transformations deals with this problem by associating the human readable values with a format that can be translated to a machine readable value, this is done using the @format attribute for each XBRL fact in an inline XBRL document.

For example, if we have a date value of Mar. 31, 2021, this date is human readable but does not comply with XBRL required format for date ISO 8601 (YYY-MM-DD), so an @format=ixt:datemonthdayyearen is add to the fact and then XBRL processor will know how to translate this date to the ISO 8601 format. Below is the above example processed by Arelle Transformation Tester plugin:

Inline XBRL Transformations

Inline XBRL Transformations

Transformations Registries
The XBRL Transformation Registry contains the rules and metrics by which transformations in Inline XBRL are performed. These rules describe how descriptive text in Inline XBRL documents can be represented as XBRL data types.

Following is a sample of transformations from transformation registry 2:

Format Code Description
ixt:booleanfalse Any string
ixt:booleantrue Any string
ixt:datedaymonth Numeric date recurring day and month
ixt:datedaymonthen English date recurring day and month
ixt:datedaymonthyear Numeric date day month and year

3.6.9 Style Guides

Style guides are one of the supporting documents that accompany an XBRL Taxonomy. Style guides helps in achieving consistency while creating, maintaining or extending the taxonomy.

Style guides set the rules for consistent language and naming conventions, styles and organization. For example a style giude rule my set the whether to use camel case or pascal case, what characters are allowed or disallowed in labels, and so on.

Examples of style guides:

3.6.10 Three Taxonomies

In this Final section we look at three different taxonomies and have overview on the choices the taxonomy authors made, there three taxonomies are:

  • IFRS Taxonomy (2020)
  • US GAAP Taxonomy (2021)
  • European Banking Authority (EBA) Taxonomy (Framework 3.1)
IFRS Taxonomy (2020) US GAAP Taxonomy (2021) EBA Taxonomy (Framework 3.1)
Link IFRS Taxonomy Resources FASB 2021 Taxonomy EBA Reporting Frame 3.1
Design Approach Standard Based Approach: For each IFRS Standard, elements reflecting disclosure requirements are identified and modeled and organized into a taxonomy Domain Model: Partitions business concepts so to meet US GAAP Financial Reporting Taxonomy ("UGT") Requirements that defined the content scope, stakeholders, users, user goals, use cases functional requirments, technical requirments and design goals. Data Point Model (DPM): DPM is a structured representation of the data, identifying all the business concepts and its relations, as well as validation rules. It contains all the relevant technical specifications necessary for developing an IT reporting solution. The XBRL Taxonomies presents the data items, business concepts, relations and validation rules described by the DPM in the technical format of an XBRL taxonomy.
Type of reporting GAAP Reporting GAAP Reporting Regulatory Reporting
Extensibility Unrestricted extensions: The purpose is to provide a framework, general principles are set out and it is left to users to determine specific extensions applying to their case Restricted/Limited extensions: Extension is allowed with strict set of rules Limited extensions: Extension is limited to labels in specific language or introducing specific assertions, the complete set of data points is defined in base taxonomy

4 Taxonomy Development Project

In this section we explore taxonomy development projects based on the XBRL US experience laid out in TDH starting section 4 page 59.

TDH breaks down the development process into 6 main components:

  • Assessing over all project scope (and defining goals)
  • Building Transport Data Model
  • Validation
  • The Mechanics of Taxonomy Development
  • Documenting a Taxonomy
  • Taxonomy Governance
Taxonomy Development

Taxonomy Development

4.1 Assess Scope and Define Goals

The goal of XBRL taxonomy is to facilitate the structured reporting of data from preparer to consumer. Project scope and goals should consider factors that enables preparers to produce the data and consumer should be able to use the data for its intended purpose.

Functional requirements represents what a taxonomy is meant to do, while Non-functional requirements imposes constraints on system design. The main focus in this stage is to identify the effect of requirements (functional and non-functional requirements) on the scope and design goals.

Factors to consider when scoping and defining goals:

  • Policy decision, such as extensibility.
  • Functional requirements vs Non-functional requirement
  • Understand use cases, how users interact with the systems to achieve their goals.
  • Identify data to be transported, and systems that produce and consume the data.
  • Stakeholders.
  • Scope of the taxonomy (industry/sector wide or limited implementation).
  • Resources required for the project.
  • Support, maintenance requirements and change management
  • Documentation and communication
  • Balancing and prioritizing requirements from stakeholders and considering cost-benefits.
  • Measures for success, such as accuracy and timeliness of data.

4.2 Building Transport Model

To build the taxonomy (Transport model), current datasets and dimensionality should be described. Again functional requirements and non-functional requirements should be mapped to the data.

During the process of building the model, minimum dataset should be determined, minumum dataset is the dataset free of redundant or extraneous information while representing all the necessary data. Current and legacy system may be a good source for determining minimum dataset(s).

Data is modeled based on o the minimum dataset, redundant and repetitive information should reduced to minimum, contextual information for a data point and relationships between data points are explored.

A data model is transformed to a transport model (XBRL Taxonomy), during this process data types are determined, core concept dimensions defined, choices like using explicit vs typed dimensions are made, model relationships are translated to XBRL linkbases.

Extensibility decision should be reflected in the taxonomy design and in determining allowable methods that users can extend a taxonomy, and how extensibility affects Comparability.

Other considerations include, reporting system (system receiving and processing reports), transport format.

4.3 Validation

Validation ensure robust and accurate data. There are two levels of validation in XBRL:

  • Basic Validation: Ensures reports are syntax valid, valid data types used and valid relationships used.
  • Regulatory/Industry Requirements: Ensures that business rules are applied, methods used include software validation, XBRL Formula Validation, XULE validation and Data Quality Committees (issues and maintain data quality rules).

See XBRL Validation.

4.4 The Mechanics of Taxonomy Development

Workflow
Multiple groups performing different tasks are needed to create a taxonomy, and workflow should be organized, TDH gives examples of the groups as follows:

  • Group responsible for creating data model and transforming it to taxonomy.
  • Group responsible for overseeing incorporation of regulatory/governance rules and changes.
  • Group responsible for reading reviewers’ comments and making recommendations for modifications.

The work flow might look as follows:

Taxonomy Dev Workflow

Taxonomy Dev Workflow

Preparing and Generating the Taxonomy
Determine the software to be used for generating the taxonomy, and perform the following steps:

  • Determine concepts’ labels: important for human readability and understanding taxonomy.
  • Building a taxonomy spreadsheet: spreadsheet containing concept, relations, and other information about the taxonomy, some software packages can use this spreadsheet to generate taxonomy files.

The Importance of Public Exposure
Taxonomy should undergo significant public review (where anyone can see and comment on the taxonomy), word ‘public’ here is relative to the size and scope of the taxonomy, and feedback and comments should be collected and analyzed.

4.5 Documenting a Taxonomy

Taxonomy is a powerful tool, and it can only fulfill its purpose if users know how to use it. Taxonomy documentation is extremely important, it communicates the goals of the taxonomy and means to achieve those goals to all stakeholders.

Documentation include:

  • Taxonomy White Paper: can be considered as an announcement of the taxonomy, with explanation of its purpose and justification for its development.
  • Taxonomy guide: explains the taxonomy it self and logic behind it.
  • Repairer’s guide: provides preparers with information about the taxonomy’s concepts and structures as needed to build XBRL reports.
  • Data Consumer Guide: provides information and common use cases for data consumers. TDH provide detailed examples of documentation in section 8 page 111.

4.6 Taxonomy Governance

The TDH recognizes four governance roles in the taxonomy development life cycle which spans over four phases.

Governance Roles:

  • Sponsor: Champions the development process and is able to bring together stakeholders successfully, could be a regulatory agency or standards organization.
  • Working Group: Includes representation of all stakeholders (regulator, preparers, developers, consumers…), this group perform the tasks to develop the taxonomy deliverables.
  • Steering Committee: highest committee and is led by the sponsor, provides oversight, evaluates major milestones, reviews and approves deliverables, and serves as “tie breaker” on major decisions concerning the taxonomy.
  • Taxonomy Manager: is the project manager, maintains detailed knowledge of the taxonomy and the project as a whole and provides day-to-day staff support for the taxonomy working group. Also interacts with feedback and reviews and comments, and reports to the steering committee and working group.
  • Working group and taxonomy steering committee can be consolidated and streamlined into a taxonomy committee.

The interaction of the above roles can be viewed as follows:

Governance structure

Governance structure

Taxonomy development Life cycle Phases:
The TDH recognizes four phases in the the taxonomy development life cycle, the goals and roles for each phase are as follows:

The lifecycle of taxonomy development and governance

The lifecycle of taxonomy development and governance

LS0tDQp0aXRsZTogIlhCUkwgLSBXaGF0IGlzIGl0PyINCmF1dGhvcjogIlNoZXJpZiBNLiBFbEdhbWFsIg0KZGF0ZTogSnVseSAyMDIxDQpvdXRwdXQ6ICANCiAgaHRtbF9ub3RlYm9vazogIA0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sgIA0KICAgIHRvYzogeWVzICANCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlIA0KICAgIHRvY19kZXB0aDogNQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzIA0KICAgIGNvZGVfZm9sZGluZzogbm9uZSANCiAgICBmaWdfY2FwdGlvbjogeWVzDQotLS0NCjxzdHlsZT4NCmJsb2NrcXVvdGUgew0KICAgIHBhZGRpbmc6IDEwcHggMjBweDsNCiAgICBtYXJnaW46IDAgMCAyMHB4Ow0KICAgIGZvbnQtc2l6ZTogMS4yZW0haW1wb3J0YW50Ow0KICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2VlZTsNCn0NCg0KI1RPQyB7DQpmb250LXNpemU6IHNtYWxsOw0Kd2hpdGUtc3BhY2U6IG5vd3JhcDsNCn0NCnByZSBjb2RlIHsNCndoaXRlLXNwYWNlOiBwcmU7DQp9DQpwcmUgew0KbWF4LWhlaWdodDogMzUwcHg7DQp9DQouc291cmNlQ29kZSB7DQogICAgb3ZlcmZsb3c6IGF1dG87DQp9DQpib2R5IHsNCnRleHQtYWxpZ246IGp1c3RpZnk7fQ0KYmxvY2txdW90ZSB7DQogICAgZm9udC1zaXplOiBpbmhlcml0Ow0KICAgIGZvbnQtc3R5bGU6IG9ibGlxdWU7DQp9DQo8L3N0eWxlPg0KKioqDQpgYGB7ciBzZXR1cCwgIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmhlcmU6OmlfYW0oJ2RvY3MveGJybF9ub3Rlc190b19zZWxmLlJtZCcpDQpzb3VyY2UoaGVyZTo6aGVyZSgnUicsICdoZWxwZXJGdW5jdGlvbnMuUicpKQ0Kb3B0aW9ucyh3aWR0aCA9IDIwMCkNCmh0bWx0b29sczo6dGFnTGlzdChybWFya2Rvd246Omh0bWxfZGVwZW5kZW5jeV9mb250X2F3ZXNvbWUoKSkNCmBgYA0KDQojIEludHJvZHVjdGlvbiAgDQoNClN0cnVjdHVyZWQgZmluYW5jaWFsIHJlcG9ydGluZyBpcyBsYXRlc3QgYW5kIGdyZWF0ZXN0IG1ldGhvZCBvZiBleGNoYW5naW5nIGZpbmFuY2lhbCBkYXRhIGFuZCByZXBvcnRzLiBUaGUgdXNlIG9mIFhCUkwgaXMgZXhwYW5kaW5nIGFsbG92ZXIgdGhlIHdvcmxkLCBhbmQgaXQgaXMgYmVjb21pbmcgdGhlIHN0YW5kYXJkIG1ldGhvZCBmb3IgZXhjaGFuZ2luZyBzdHJ1Y3R1cmVkIGZpbmFuY2lhbCByZXBvcnRzLiANCg0KVGhlIG9iamVjdGl2ZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIHByb3ZpZGUgdGhlIHJlYWRlciB3aXRoIGEgYmFzaWMgdW5kZXJzdGFuZGluZyBvZiBfd2hhdCBYQlJMIGlzXywgX3doYXQgaXQgZG9lc18sIGFuZCBfaG93IGl0IGlzIGltcGxlbWVudGVkXy4NCg0KUGFydHMgb2YgdGhpcyBtYXRlcmlhbCBkZXBlbmRzIGhlYXZpbHksIGFuZCByZWZlcnMgdG8gdGhlIFsqKl9YQlJMIFRheG9ub215IERldmVsb3BtZW50IEhhbmRib29rXyoqXShodHRwczovL3hicmwudXMveGJybC1yZWZlcmVuY2UvdGRoLykgcHVibGlzaGVkIGJ5IFtYQlJMIFVTXShodHRwczovL3hicmwudXMvKSBhbmQgcHVibGljbHkgYXZhaWxhYmxlIG9uIHRoZSB0aGVpciB3ZWJzaXRlLiBBcyBtZW50aW9uZWQgaW4gdGhlIHByZWZhY2Ugb2YgdGhlIGhhbmRib29rLCBpdCB3YXMgY3JlYXRlZCBhcyBhIGd1aWRlIGZvciBjcmVhdGluZyBYQlJMIHRheG9ub21pZXMgYmFzZWQgb24gWEJSTCBVUyBleHBlcmllbmNlLCB3aGljaCBtYWtlcyBpdCBhIHZlcnkgdmFsdWFibGUgcmVzb3VyY2UgZm9yIGFueW9uZSBvciBvcmdhbml6YXRpb24gaW50ZXJlc3RlZCBpbiBpbXBsZW1lbnRhdGlvbiBvZiBYQlJMLg0KDQojIE91dGNvbWVzICANCg0KVGhpcyBtYXRlcmlhbCBzaG91bGQgcHJvdmlkZTogIA0KDQoqIEJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgWEJSTCBhbmQgaXRzIGNvbXBvbmVudHMgIA0KKiBGYW1pbGlhcml0eSB3aXRoIGNvcmUgdGVybWlub2xvZ3kgYW5kIHdoYXQgaXQgcmVmZXJzIHRvICANCiogQmFzaWMgdW5kZXJzdGFuZGluZyBvZiBUYXhvbm9teSBhbmQgaW5zdGFuY2UgZG9jdW1lbnQgIA0KKiBCYXNpYyB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwcm9jZXNzIG9mIGRldmVsb3BtZW50IG9mIGFuIFhCUkwgdGF4b25vbXkgYW5kIHN0cnVjdHVyZWQgcmVwb3J0aW5nIHByb2Nlc3MgIA0KKiBVbmRlcnN0YW5kaW5nIHRoZSBlY29zeXN0ZW0gb2Ygc3RydWN0dXJlZCBmaW5hbmNpYWwgcmVwb3J0aW5nIGFuZCB0aGUgc3VwcG9ydGluZyB0ZWNobm9sb2dpZXMgIA0KDQojIFdoeSBYQlJMIGFuZCB3aGF0IGlzIGl0IGV4YWN0bHk/DQoNCl9fWEJSTF9fIHN0YW5kcyBmb3IgX2VYdGVuc2libGUgQnVzaW5lc3MgUmVwb3J0aW5nIExhbmd1YWdlXywgYW5kIGl0IGlzIGRlZmluZWQgYXM6ICANCg0KPlhCUkwgcHJvdmlkZXMgYSBsYW5ndWFnZSBpbiB3aGljaCByZXBvcnRpbmcgdGVybXMgY2FuIGJlIGF1dGhvcml0YXRpdmVseSBkZWZpbmVkLiBUaG9zZSB0ZXJtcyBjYW4gdGhlbiBiZSB1c2VkIHRvIHVuaXF1ZWx5IHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgZmluYW5jaWFsIHN0YXRlbWVudHMgb3Igb3RoZXIga2luZHMgb2YgY29tcGxpYW5jZSwgcGVyZm9ybWFuY2UgYW5kIGJ1c2luZXNzIHJlcG9ydHMuIFhCUkwgbGV0cyByZXBvcnRpbmcgaW5mb3JtYXRpb24gbW92ZSBiZXR3ZWVuIG9yZ2FuaXphdGlvbnMgcmFwaWRseSwgYWNjdXJhdGVseSBhbmQgZGlnaXRhbGx5LmByIHR1ZnRlOjpxdW90ZV9mb290ZXIoJy0tLSBbWEJSTC5vcmddKGh0dHBzOi8vd3d3Lnhicmwub3JnL3RoZS1zdGFuZGFyZC93aGF0L2FuLWludHJvZHVjdGlvbi10by14YnJsLyN3aGF0LWlzLXhicmwpJylgDQoNClhCUkwgY2FuIGFsc28gYmUgZGVzY3JpYmVkIGluIHRlcm1zIG9mIHdoYXQgaXQgZG9lcywgaW4gYnJpZWYsIFhCUkwgcHJvdmlkZXMgc3RhbmRhcmRzIGZvciBzdG9yaW5nIGFuZCBlbGVjdHJvbmljIGNvbW11bmljYXRpb24gb2YgZmluYW5jaWFsIGluZm9ybWF0aW9uIGVuYWJsaW5nIGVmZmljaWVudCBwcm9jZXNzaW5nLCBzdG9yYWdlLCByZXRyaWV2YWwsIGFuYWx5c2lzIGFuZCBjb21wYXJpc29uIG9mIHRoZSBpbmZvcm1hdGlvbi4gDQoNClRoZSBpbmNyZWFzZSBpbiBzaXplIG9mIGRhdGEgYW5kIHJlZ3VsYXRvcnkgcmVxdWlyZW1lbnRzIGRlcml2ZXMgdGhlIG5lZWQgZm9yIG1vcmUgZWZmaWNpZW50IGFuZCBzdHJ1Y3R1cmVkIG1ldGhvZHMgdG8gaGFuZGxlIHRoaXMgZGF0YSBhbmQgY29udmVydCBpdCBpbnRvIGEgcmVzb3VyY2UgcmF0aGVyIHRoYW4gYSBidXJkZW4uIA0KDQojIyBIb3cgZG8gd2UgY29sbGVjdCBmaW5hbmNpYWwgZGF0YQ0KDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbUmVndWxhdG9yeSBSZXBvcnRpbmddKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL2NvbGxlY3RpbmdEYXRhLnN2ZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqUmVndWxhdG9yeSBSZXBvcnRpbmcqKg0KPC9wPg0KPC9kaXY+DQoNCmBgYHtyIGNoYW5nZXNfaW5fZGF0YV9jb2xsZWN0aW9uLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBldmFsPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuY2FwPSdIb3cgd2UgY29sbGVjdCBEYXRhJ30NCkRpYWdyYW1tZVI6OmdyVml6KCINCg0KZGlncmFwaCB3aXRoX3RpdGxlIHsNCg0KICBncmFwaCBbc3BsaW5lcz1vcnRobywgcmFua2Rpcj1MUiwgbGFiZWw9J0NoYW5nZXMgaW4gaG93IHdlIGNvbGxlY3QgZGF0YSddDQogIA0KICBub2RlIFtzaGFwZT1ib3gsIHN0eWxlPSdmaWxsZWQnLCBjb2xvcj10cmFuc3BhcmVudCwgZmlsbGNvbG9yPScjZjVmNWY1JywgZm9udG5hbWU9SGVsdmV0aWNhLCBmb250Y29sb3I9JyMyYzNlNTAnXQ0KICANCiAgYVtsYWJlbD0nUGFwZXIgQmFzZWQgU3VibWlzc2lvbnMnXTsgDQogIGNbbGFiZWw9J1NwcmVhZHNoZWV0cyBhbmQgRmxhdCBmaWxlcyddOyANCiAgZFtsYWJlbD0nV2ViIEJhc2VkIEZvcm1zJ107IGVbbGFiZWw9WEJSTF0NCiAgDQogIGVkZ2VbY29sb3I9JyMyNDI0MjQnLCBwZW53aWR0aD0wLjJdDQogIA0KICBhIC0+IGMgLT4gZCAtPiBlDQp9ICAgICAgICAgICAgICAgICANCiIsIGhlaWdodD0iMTAwJSIsIHdpZHRoPSIxMDAlIikNCmBgYA0KDQoNClRoZSBtZXRob2RzIGFuZCBwcm9jZXNzZXMgb2YgZmluYW5jaWFsIGRhdGEgY29sbGVjdGlvbiBldm9sdmVkIG92ZXIgdGltZSwgd2Ugc3RhcnRlZCB3aXRoIHBhcGVyIGJhc2VkIHN1Ym1pc3Npb25zLCB0aGVuIHNwcmVhZHNoZWV0cyBhbmQgZmxhdCBmaWxlcyB3ZXJlIHVzZWQsIHRoZW4gZWxlY3Ryb25pYyBzdWJtaXNzaW9ucyB0aHJvdWdoIHdlYiBiYXNlZCBwb3J0YWxzLiBYQlJMIGlzIHRoZSBuZXh0IG5ld2VzdCB0aGluZyBpbiB0aGlzIGV2b2x1dGlvbiwgYmVuZWZpdHMgb2YgWEJSTCBjYW4gYmUgc3VtbXVyaXplZCBhcyBmb2xsb3dzOiANCg0KPGRpdj4NCjxjZW50ZXI+DQohW1doYXQgWEJSTCBQcm92aWRlc10oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMvd2h5X3hicmwuc3ZnJylgKQ0KPC9jZW50ZXI+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KKipXaGF0IFhCUkwgUHJvdmlkZXMqKg0KPC9wPg0KPC9kaXY+DQoNCg0KKiBYQlJMIHByb3ZpZGVzIGZvciBhIHN0YWJsZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgY29udGVudCAgDQoqIFhCUkwgc2VwYXJhdGVzIGRhdGEgY29udGVudCBmcm9tIHRoZSBmb3JtIG9mIHRoZSBzdWJtaXNzaW9uIA0KKiBYQlJMIFByb3ZpZGVzIGZvciBhdXRvbWF0aW9uLCB3aGljaCBpbmNyZWFzZXMgYWNjdXJhY3ksIGNvc3QgYW5kIHRpbWUgc2F2aW5ncyAgDQogIA0KQW5kIG1hbnkgbW9yZSBiZW5lZml0cyByZWxhdGluZyB0byB0aGUgcXVhbGl0eSBhbmQgcmljaG5lc3Mgb2YgdGhhdCBkYXRhLg0KDQoNCiMjIyBDdXJyZW50IGlzc3VlcyB0aGF0IFhCUkwgYWRkcmVzc2VzDQoNCkFzIG1lbnRpb25lZCwgWEJSTCBwcm92aWRlcyBmb3Igc3RydWN0dXJlZCBjb250ZXh0dWFsbHkgcmljaCBtYWNoaW5lIHJlYWRhYmxlIGRhdGEsIHdoaWNoIGFsbG93cyBmb3IgYXV0b21hdGlvbiwgYW5kIHRoYXQgYWRkcmVzcyBtb3N0IG9mIHRoZSBtYWluIGRhdGEgaXNzdWVzIGluIGdlbmVyYWwsIGZvciByZWd1bGF0b3JzIGFuZCBmb3IgaXNzdWVycy4NCg0KKipHZW5lcmFsIElzc3VlczoqKiAgDQoNCiogTWFjaGluZSBSZWFkYWJsZTogcmVwb3J0cyB3aXRoIFhCUkwgdGFnZ2luZyBjYW4gYmUgY29uc3VtZWQgYW5kIGFuYWx5emVkIGJ5IGNvbXB1dGVycyB0aHJvdWdoIFhCUkwgZW5hYmxlZCBzb2Z0d2FyZSAoWEJSTCBQcm9jZXNzb3JzKSBhcyBvcHBvc2VkIHRvIHBhcGVyIGJhc2VkIG9yIHVuc3RydWN0dXJlZCByZXBvcnRzLiAgIA0KKiBJbnRlcm9wZXJhYmlsaXR5OiBYQlJMIGlzIHNlbGYtZGVzY3JpYmluZyBhbmQgdXNlcyBYTUwgc3ludGF4IHdoaWNoIG1ha2VzIHRoZSBpbmZvcm1hdGlvbiBpbiBYQlJMIHN5c3RlbSBpbmRlcGVuZGVudCwgaW4gb3RoZXIgd29yZHMsIHRoZSBzYW1lIFhCUkwgaW5mb3JtYXRpb24gcGFja2FnZSBjYW4gYmUgY29uc3VtZWQgYnkgYW55IHN5c3RlbSB0aGF0IGhhcyBYQlJMIGVuYWJsZWQgc29mdHdhcmUsIHdoaWNoIGFkZHJlc3NlcyBfY29tcGF0aWJpbGl0eV8gaXNzdWVzLiAgDQoqIEl0IHByb3ZpZGVzIGZvciBhIGNvbW1vbiBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBleGNoYW5naW5nIGFueSBmaW5hbmNpYWwgaW5mb3JtYXRpb24sIGhlbmNlIGl0IHByb3ZpZGVzIGEgY29tbW9uIGxhbmd1YWdlIGZvciBleGNoYW5naW5nIGRhdGEsIGFkZHJlc3NpbmcgX2NvbXBhcmFiaWxpdHlfIGlzc3Vlcy4gICAgDQoqIFhCUkwgcHJvdmlkZXMgZm9yIGF1dG9tYXRlZCBtZWFucyBvZiBjb21waWxpbmcsIHRyYW5zbWl0dGluZywgdmFsaWRhdGluZyBhbmQgYW5hbHl6aW5nIGZpbmFuY2lhbCBkYXRhLCB3aGljaCBpbmNyZWFzZSBfZWZmaWNpZW5jeV8sIHRpbWUgYW5kIGNvc3Qgc2F2aW5nIGFuZCBhdCB0aGUgc2FtZSB0aW1lIGluY3JlYXNpbmcgcXVhbGl0eSBvZiBkYXRhLiAgDQoqIFhCUkwgcHJvdmlkZXMgaGlnaCBxdWFsaXR5LCBjb250ZXh0dWFsbHkgcmljaCBmaW5hbmNpYWwgZGF0YSByYXRoZXIgdGhhbiBfZnJhZ21lbnRlZF8gZGF0YS4gIA0KKiBYQlJMIGlzIGZyZWUgYW5kIG9wZW5zb3VyY2Ugc3RhbmRhcmQsIHdpdGggbm8gbGljZW5zaW5nIGZlZXMsIGFkZHJlc3NlcyBpc3N1ZXMgb2YgcHJvcGl0aWF0b3J5IHN0YW5kYXJkcyBhbmQgc29mdHdhcmUsIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IFhCUkwgZW5hYmxlZCBzb2Z0d2FyZSBpcyBub3QgZnJlZS4NCg0KDQoqKlJlZ3VsYXRvciBJc3N1ZXMqKjogIA0KDQoqIEhpZ2ggdm9sdW1lcyBvZiBkYXRhIGFuZCByZXBvcnRzOiBhcyBtZW50aW9uZWQsIFhCUkwgcHJvdmlkZXMgZm9yIGF1dG9tYXRpb24gaW4gY29sbGVjdGluZyBhbmQgcHJvY2Vzc2luZyBkYXRhLCB3aGljaCBmYWNpbGl0YXRlcyBoYW5kbGluZyBoaWdoIHZvbHVtZXMgaW4gYW4gYWNjdXJhdGUgYW5kIGVmZmljaWVudCBtYW5uZXIuICANCiogUmV2aWV3IGFuZCB2YWxpZGF0aW9uOiBYQlJMIGdpdmUgZmluYW5jaWFsIHJlcG9ydCBhIHN0cnVjdHVyZSB0aGF0IGVuYWJsZSBjcmVhdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIGJhc2VkIG9uIHJlZ3VsYXRpb25zLCBidXNpbmVzcyBydWxlcyBhbmQgYW55IG90aGVyIGNyaXRlcmlhLCBhbmQgdGhhdCBpbiB0dXJuIGVuYWJsZXMgcXVpY2sgY29ycmVjdGl2ZSBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiBuZWVkZWQuICAgIA0KKiBEYXRhIGNhbiBiZSBzdG9yZWQgZm9yIGNyb3NzIGNoZWNraW5nIGFuZCBmdXJ0aGVyIGFuYWx5c2lzIGFuZCBjb21wYXJpc29uLiAgDQoqIFNpbmdsZSBzb3VyY2Ugb2YgdGhlIHRydXRoLCBYQlJMIHN0cnVjdHVyZSBhbGxvd3MgZGF0YSB0byBiZSB1c2VkIGZvciBtYW55IHB1cnBvc2VzLCBmb3IgZXhhbXBsZSwgc2FtZSByZXBvcnQgY2FuIGNvbnRhaW4gZGF0YSBzdHJ1Y3R1cmVzIHJlcXVpcmVkIGZvciBhIHJlZ3VsYXRvciwgY2Vuc3VzLCB0YXhlcyAuLi4NCg0KKipJc3N1ZXIgSXNzdWVzKio6ICANCg0KKiBTaW1wbGlmaWVzIHRoZSBjb21waWxhdGlvbiBvZiByZXBvcnRzIHJlcXVpcmVkIGJ5IG11bHRpcGxlIHJlZ3VsYXRvcnMgZnJvbSB0aGUgc2FtZSBkYXRhc2V0LiAgICANCiogWEJSTCB0YXhvbm9taWVzIGFuZCB0aGUgcmVsYXRlZCBndWlkZXMgaXNzdWVkIGJ5IHJlZ3VsYXRvcnMgcHJvdmlkZSBmb3IgY2xlYXIgYW5kIHVuYW1iaWd1b3VzIHJlcG9ydGluZyByZXF1aXJlbWVudHMsIGFuZCBzaW1wbGlmaWVzIGNvbXBsaWFuY2UuICANCiogUmVkdWNlcyB0aGUgY2hhbmNlIG9mIGNvc3RseSBlcnJvcnMuDQogIA0KDQojIyBXaG8gdXNlcyBYQlJMPyAgDQoNClRoZSBYQlJMIFRheG9ub215IERldmVsb3BtZW50IEhhbmRib29rIGluIHBhZ2UgNiBsaXN0cyBzdWNjZXNzZnVsIGltcGxlbWVudGF0aW9uIG9mIFhCUkwgYXJvdW5kIHRoZSB3b3JsZHMsIHRoYXQgaW5jbHVkZXM6DQoNCiogKipVbml0ZWQgU3RhdGVzKio6IFN0b2NrIGV4Y2hhbmdlIGNvbW1pc3Npb24gKFNFQyksIGFuZCBGaW5hbmNpYWwgRGVwb3NpdG9yeSBJbnN1cmFuY2UgQ29ycG9yYXRpb24gKEZESUMpIHdpdGggdG90YWwgcmVwb3J0aW5nIGVudGl0aWVzIG9mIG92ZXIgMTcsNTAwICANCiogKipVbml0ZWQgS2luZ2RvbSoqOiBIZXIgTWFqZXN0eeKAmXMgUmV2ZW51ZXMgJiBDdXN0b21zIChITVJDKSwgYW5kIENvbXBhbmllcyBIb3VzZSB3aXRoIHJlcG9ydGluZyBlbnRpdGllcyBvZiBvdmVyIDIgbWlsbGlvbiAgDQoqICoqU3BhaW4qKjogQnVzaW5lc3MgUmVnaXN0cmFyLCBCYW5raW5nIFJlZ3VsYXRvciwgU2VjdXJpdGllcyBSZWd1bGF0aW9uLCBBY2NvdW50aW5nIE92ZXJzaWdodCBhbmQgU3RhdGUgRmVkZXJhbCBDb21wdHJvbGxlciB3aXRoIHJlcG9ydGluZyBlbnRpdGllcyBvZiBvdmVyIDgwMCwwMDAgIA0KDQoqICoqT3RoZXJzKio6IEV1cm9wZSAoRXVyb3BlYW4gU2luZ2xlIEVsZWN0cm9uaWMgRm9ybWF0IEVTRUYpLCBJbmRpYSwgU2luZ2Fwb3JlLCBTb3V0aCBLb3JlYSwgSXRhbHksIFBlcnUsIFdvcmxkIGJhbmsgYW5kIG1hbnkgb3RoZXJzICANCg0KKiAqKkdvdmVybm1lbnRzIGFuZCBnb3Zlcm5tZW50IGFnZW5jaWVzICoqYWxsb3ZlciB0aGUgd29ybGQgYXJlIHVzaW5nIFhCUkwsIGNvdW50cmllcyBsaWtlICoqTmV0aGVybGFuZHMqKiBhbmQgKipBdXN0cmFsaWEqKiBpbXBsZW1lbnRlZCBbKipTdGFuZGFyZCBCdXNpbmVzcyBSZXBvcnRpbmcgKFNCUikgcHJvZ3JhbXMqKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3RhbmRhcmRfQnVzaW5lc3NfUmVwb3J0aW5nKSB3aGljaCBhcmUgcHJvZ3JhbXMgZGVzaWduZWQgdG8gcmVkdWNlIHJlZ3VsYXRvcnkgYnVyZGVuIGZvciBidXNpbmVzc2VzIGFuZCByZWxpZXMgaGVhdmlseSBvbiBYQlJMLg0KDQpDdXJyZW50bHkgWEJSTCBpbnRlcm5hdGlvbmFsIHdlYnNpdGUgbGlzdHMgW21vcmUgdGhhbiAyMCBYQlJMIGp1cmlzZGljdGlvbnNdKGh0dHBzOi8vd3d3Lnhicmwub3JnL3RoZS1jb25zb3J0aXVtL2Fib3V0L2p1cmlzZGljdGlvbnMvKSAoYSBqdXJpc2RpY3Rpb24gaXMgYSBsb2NhbCByZXByZXNlbnRhdGl2ZSBmb3IgWEJSTCAgYWN0aW5nIGFzIHRoZSBwcmltYXJ5IGxpYWlzb24gdG8gbmF0aW9uYWwgZ292ZXJubWVudCwgdGVjaG5vbG9neSBmaXJtcyBhbmQgYnVzaW5lc3MgY29tbXVuaXRpZXMpDQoNCiMjIyBYQlJMIEltcGxlbWVudGF0aW9ucyBNYXAgIA0KWEJSTCB3ZWJzaXRlIHByZXNlbnRzIGEgbWFwIGFuZCBsaXN0aW5nIGZvciBYQlJMIGltcGxlbWVudGF0aW9uIHByb2plY3RzIHdvcmxkIHdpZGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgW2hlcmVdKGh0dHBzOi8vd3d3Lnhicmwub3JnL3RoZS1zdGFuZGFyZC93aHkveGJybC1wcm9qZWN0LWRpcmVjdG9yeS8pICANCg0KPGlmcmFtZSBzdHlsZT0iYm9yZGVyOiAwOyIgc3JjPSJodHRwczovL2RhdGFzdHVkaW8uZ29vZ2xlLmNvbS9lbWJlZC9yZXBvcnRpbmcvMTVTbVBBVmhUaWVjcm5yVlVSQ3FCTzI1S3RzeWEyZUNUL3BhZ2UvSnBtaSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iNTUwIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPSJhbGxvd2Z1bGxzY3JlZW4iIGRhdGEtZXh0ZXJuYWw9IjEiPjwvaWZyYW1lPg0KDQoqKldoeSBYQlJMPyoqIEluIHNob3J0LCBpdCBhZGRyZXNzZXMgbW9zdCBjdXJyZW50IGlzc3VlcyByZWxhdGluZyB0byBleGNoYW5nZSBvZiBmaW5hbmNpYWwgZGF0YSwgaXQgaXMgd2lkZWx5IHVzZWQgYWxsb3ZlciB0aGUgd29ybGQsIGFuZCBpdCBpcyBzaW1wbHkgdGhlIG5leHQgc3RlcCBpbiB0aGUgZXZvbHV0aW9uIG9mIGZpbmFuY2lhbCBkYXRhIGV4Y2hhbmdlIHN5c3RlbXMuDQoNCiMjIFdoYXQgaXMgRXh0ZW5zaWJsZSBCdXNpbmVzcyBSZXBvcnRpbmcgTGFuZ3VhZ2UgKFhCUkwpPw0KDQoqKlRoZSBTcGVjaWZpY2F0aW9ucyoqICAgDQpUZWNobmljYWxseSBYQlJMIGlzIGJhc2VkIG9uIF9fWE1MX18gXyhlWHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSlfLCBpdCBjYW4gYmUgc2FpZCB0aGF0ICoqWEJSTCBpcyBhbiBYTUwgZXh0ZW5zaW9uKiogb3B0aW1pemVkIHRvIGRlYWwgd2l0aCBidXNpbmVzcyBpbmZvcm1hdGlvbi4gSW4gb3RoZXIgd29yZHMsICBYQlJMIGRvZXMgd2hhdCBpdCBkb2VzIGJ5IGJlaW5nIGJhc2VkIG9uICBYTUwuICANCg0KW1hCUkwgaXMgYSBzZXQgb2Ygc3BlY2lmaWNhdGlvbnNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlY2lmaWNhdGlvbnMuaHRtbCkgZGV2ZWxvcGVkIGFuZCBtYWludGFpbmVkIGJ5IFtYQlJMIEludGVybmF0aW9uYWxdKGh0dHBzOi8vd3d3Lnhicmwub3JnLykuIFRoZSBiYXNlIFhCUkwgc3BlY2lmaWNhdGlvbiAobm93IHZlcnNpb24gMi4xKSBpcyBzdGFibGUgc2luY2UgMjAwMywgd2l0aCBhZGRpdGlvbmFsIHNwZWNpZmljYXRpb25zIGJlaW5nIGFkZGVkIHRvIGF1Z21lbnQgaXQgc3VjaCBhcyBYQlJMIERpbWVuc2lvbnMuICANCg0KWEJSTCBzcGVjaWZpY2F0aW9uIGFyZSBmcmVlbHkgYXZhaWxhYmxlIHdpdGhvdXQgbGljZW5zaW5nLCBub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFwcGx5IGZvciBYQlJMIGVuYWJsZWQgc29mdHdhcmUgd2hpY2ggbWlnaHQgaGF2ZSBsaWNlbnNpbmcgZmVlcy4gDQoNCioqRGF0YSBNb2RlbCoqICANClhCUkwgc3BlY2lmaWNhdGlvbnMgYXJlIHRvb2xzIHRoYXQgZW5hYmxlcyB0aGUgZGVmaW5pdGlvbiBvZiAgZGljdGlvbmFyaWVzLCBkYXRhIG1vZGVscyBhbmQgcnVsZXMgY2FsbGVkICoqWEJSTCBUYXhvbm9taWVzKiosIGFsc28gWEJSTCBzcGVjaWZpY2F0aW9ucyBwcm92aWRlIHRoZSB0b29scyB0byBjcmVhdGUgc3RydWN0dXJlZCBmaW5hbmNpYWwgcmVwb3J0cyBiYXNlZCBvbiBYQlJMIFRheG9ub21pZXMsIHRoZXNlIGZpbmFuY2lhbCByZXBvcnRzIGFyZSBjYWxsZWQgKipYQlJMIEluc3RhbmNlcyoqLiAgDQoNClNvIHdlIGNhbiBzYXkgdGhhdCBYQlJMIGlzIHRoZSBzZXQgb2YgdG9vbHMgdXNlZCB0byBjcmVhdGUgZGF0YSBtb2RlbHMgYW5kIHN0cnVjdHVyZXMgdGhhdCBhcmUgdGhlIGJhc2lzIGZvciBzdHJ1Y3R1cmVkIGZpbmFuY2lhbCByZXBvcnRpbmcuIA0KDQoNCioqQ29tbXVuaWNhdGlvbiBMYW5ndWFnZSoqICANClRoZSBwdXJwb3NlIG9mIFhCUkwgaXMgdG8gZW5hYmxlIGV4Y2hhbmdlIG9mIHN0cnVjdHVyZWQgZmluYW5jaWFsIGRhdGEgYmV0d2VlbiBzeXN0ZW1zLCBzb21lIHRpbWVzIHRoZSB0ZXJtICJ0cmFuc3BvcnQgbW9kZWwiIGlzIHVzZWQgdG8gcmVmZXIgdG8gWEJSTC4gDQoNCj4gIkEgX1RyYW5zcG9ydCBNb2RlbF8gIHNlcnZlcyBhcyBhbiBvcmdhbml6YXRpb25hbCBzdHJ1Y3R1cmUgd2hlbiBtb3ZpbmcgZGF0YSBmcm9tIGEgc291cmNlIHRvIGEgY29uc3VtZXIiIGByIHR1ZnRlOjpxdW90ZV9mb290ZXIoJy0tLSBbVERIIHNlY3Rpb24gMi4xLjIgcGFnZSAxMF0oaHR0cHM6Ly94YnJsdXMuZ2l0aHViLmlvL2RvY3MvdGRoLmh0bWwpJylgDQoNCg0KVW5kZXJzdGFuZGluZyBYQlJMIGFuZCBob3cgaXQgZG9lcyB3aGF0IGl0IGRvZXMsIHN0YXJ0IHdpdGggWE1MLCBpbiB0aGUgbmV4dCBzZWN0aW9uIHdlIHdpbGwgZ28gdGhyb3VnaCBzb21lIG9mIFhNTCBjb25jZXB0cyB0aGF0IGFyZSByZWxldmFudCB0byB1bmRlcnN0YW5kaW5nIFhCUkwuDQoNCiMjIFhNTCBhbmQgbWFya3VwIGxhbmd1YWdlcyANCg0KIyMjIEJhY2sgaW4gdGltZSAgDQoNClRvIGV4cGxhaW4gdGhlIG1vc3QgYmFzaWMgY29uY2VwdCBvZiBtYXJrdXAgbGFuZ3VhZ2VzIHdlIG5lZWQgdG8gdGFrZSBhIHRyaXAgYmFjayBpbiB0aW1lLCB0byB0aGUgYW5jaWVudCBFZ3lwdGlhbiB3cml0aW5ncy4NCg0KPGNlbnRlcj4NClshWyoqQ2FydG91Y2hlKipdKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL29sZC5qcGcnKWApe3dpZHRoPTMwJSBoZWlnaHQ9MzAlfV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FydG91Y2hlKXt0YXJnZXQ9X2JsYW5rfSAgDQo8c3ViPl9bSW1hZ2UgYnkgT3NhbWEgU2h1a2lyIE11aGFtbWVkIEFtaW4gRlJDUChHbGFzZyksIENDIEJZLVNBIDQuMCA8aHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMD4sIHZpYSBXaWtpbWVkaWEgQ29tbW9uc11fPHN1Yj4NCjwvY2VudGVyPg0KDQpJbiB0aGUgaW1hZ2UgYWJvdmUsIHNvbWUgd3JpdGluZyBpcyBlbmNhcHN1bGF0ZWQgaW4gYW4gb3ZhbCBzaGFwZSBjYWxsZWQgIkNhcnRvdWNoZSIsIGFjY29yZGluZyB0byB0aGUgY29tbW9uIHVuZGVyc3RhbmRpbmcsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZW5jYXBzdWxhdGVkIHdyaXRpbmcgcmVwcmVzZW50cyBhIHJveWFsIG5hbWUuIFRoZSBhbmNpZW50IEVneXB0aWFucyBjaG9vc2UgdGhpcyBtZXRob2QgdG8gZHJhdyB0aGUgYXR0ZW50aW9uIHRvIHRoZSBpbmZvcm1hdGlvbiBieSBtYXJraW5nIG9yICJ0YWdnaW5nIiB0aGlzIGltcG9ydGFudCBpbmZvcm1hdGlvbiBieSB0aGUgb3ZhbCBzaGFwZS4NCg0KTWFya3VwIGxhbmd1YWdlcyBkbyB0aGUgc2FtZSB0aGluZywgaXQgaXMgX3RhZ2dpbmdfIGltcG9ydGFudCBmaW5hbmNpYWwgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gYSByZXBvcnQsIGluIHRoZSBjYXNlIG9mIFhCUkwsIHRoaXMgdGFnZ2luZyBoYXMgY29uc2VxdWVuY2VzIHdoZW4gdGhlIGluZm9ybWF0aW9uIGlzIHByb2Nlc3NlZCBieSBhIGNvbXB1dGVyLg0KDQoNCk1hcmt1cCBsYW5ndWFnZXMgaW4gZ2VuZXJhbCB0YWdzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciBhIGRvY3VtZW50IGluIGEgd2F5IHRoYXQgbWFrZXMgaXQgbWFjaGluZSByZWFkYWJsZSwgaS5lLiB3aGVuIHByb2Nlc3NlZCBieSBhIGNvbXB1dGVyLCB0aGUgdGFncyB0ZWxsIHRoZSBjb21wdXRlciB3aGF0IHRvIGRvIHdpdGggdGhlIGNvbnRlbnQuICANCg0KTWFya3VwIGxhbmd1YWdlcyBoYXMgZGlmZmVyZW50IHB1cnBvc2VzLCBmb3IgZXhhbXBsZSAqKkh5cGVyIFRleHQgTWFya3VwIExhbmd1YWdlICgiSFRNTCIpKiogdGFncyB0ZWxsIHRoZSBjb21wdXRlciBob3cgdG8gZGlzcGxheSB0aGUgY29udGVudCwgd2hpbGUgZmV3IG9mIHRoZSBtYWluIHB1cnBvc2VzIG9mICoqWE1MKiogaXMgdG8gc3RvcmUsIG9yZ2FuaXplIGFuZCB0cmFuc3BvcnQgY29udGVudCBiZXR3ZWVuIHN5c3RlbXMuDQoNCk1hcmt1cCBsYW5ndWFnZXMgYXJlIHVzdWFsbHkgc3lzdGVtIGluZGVwZW5kZW50LCBmb3IgZXhhbXBsZSBhbGwgc3lzdGVtcyBoYXZlIHRvb2xzIHRvIHJlYWQgYW5kIHBhcnNlIFhNTCwgaW4gb3RoZXIgd29yZHMsIGFuIFhNTCBmaWxlIGNyZWF0ZWQgaW4gYSBXaW5kb3dzIHN5c3RlbSBjYW4gYmUgcmVhZCBhbiBwYXJzZWQgYnkgYSBMaW51eCBiYXNlZCBzeXN0ZW0uICANCg0KDQojIyBYTUwgQmFzaWNzICANCg0KQXMgbWVudGlvbmVkIFhNTCBpcyBhIG1hcmt1cCBsYW5ndWFnZSwgYW5kIGl0IGlzIGEgc2V0IG9mIHNwZWNpZmljYXRpb25zLCBydWxlcyBhbmQgdG9vbHMgZm9yIGRlc2NyaWJpbmcsIHN0b3JpbmcsIGFuZCB0cmFuc3BvcnRpbmcgZGF0YSBiZXR3ZWVuIHN5c3RlbXMuDQoNCkFzc3VtZSB0aGF0IHdlIHdhbnQgdG8gZW5jb2RlIGEgdGFibGUgb2YgaW52b2ljZXMgaW50byBYTUwsIGEgZnJhZ21lbnQgb2YgdGhhdCBYTUwgbWlnaHQgbG9vayBhcyBmb2xsb3dzOg0KDQpgYGB7ciB4bWxfaW50cm9fZnJhZywgZWNobz1GQUxTRX0gDQpmbl9Db2RlQ2h1bmtPdXQobGFuZyA9ICdYTUwnLCB0eHQ9DQonPHRhYmxlPiANCiAgPGludm9pY2UgQ3VzdG9tZXJOYW1lPSJhYmMiIEludm9pY2VOdW09IjEwMSI+NTg5LjkxPC9pbnZvaWNlPg0KICA8aW52b2ljZSBDdXN0b21lck5hbWU9Inh5eiIgSW52b2ljZU51bT0iMTAxIj4yNTcuNDI8L2ludm9pY2U+DQo8L3RhYmxlPicpDQpgYGANCiMjIyBYTUwgRm9ybQ0KWE1MIGRvY3VtZW50IGlzIGNvbXBvc2VkIG9mIGVsZW1lbnRzLCBlYWNoIGVsZW1lbnQgc3RhcnRzIHdpdGggYW4gb3BlbmluZyB0YWcgYW5kIGVuZHMgd2l0aCBhIGNsb3NpbmcgdGFnLCB0aGVyZSBjYW4gYmUgdmFsdWVzIG9yIG90aGVyIGVsZW1lbnRzIHdpdGhpbiB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzLiBUaGUgWE1MIHN0cnVjdHVyZSBpcyBpbiB0aGUgZm9ybSBvZiBhIHRyZWUsIGhhdmluZyBhIHJvb3QgZWxlbWVudCBjb250YWluaW5nIGFsbCBvdGhlciBlbGVtZW50cy4gIA0KDQpgPHRhYmxlPmAgYW5kIGA8L3RhYmxlPmAgaW4gdGhlIGFib3ZlIFhNTCBmcmFnbWVudCBhcmUgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgPGNvZGUgc3R5bGU9ImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGFnczwvY29kZT4gb2YgdGhlIHJvb3QgZWxlbWVudCBjYWxsZWQgYHRhYmxlYC4gSW4gdGhlIGFib3ZlIGZyYWdtZW50LCB0aGUgcm9vdCBlbGVtZW50IGhhcyBvbmx5IG9uZSBjaGlsZCBlbGVtZW50IGNhbGxlZCBgaW52b2ljZWAuIFRoZSBpbnZvaWNlIG9wZW5pbmcgdGFnIGNvbnRhaW5zIG90aGVyIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGtleSwgdmFsdWUgcGFpcnMgYGN1c3RvbWVyTmFtZT0iYWJjIiwgaW52b2ljZU51bT0xMDFgLCB0aGVzZSBhcmUgY2FsbGVkIDxjb2RlIHN0eWxlPSJjb2xvcjogcmVkOyBmb250LXdlaWdodDogYm9sZDsiPmF0dHJpYnV0ZXM8L2NvZGU+LCB3aGljaCBhdHRhY2hlcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbGVtZW50IGFuZCBhcmUgdXN1YWxseSByZWZlcnJlZCB0byB1c2luZyB0aGUgYEBgIHN5bWJvbCwgYXMgaW4gYEBjdXN0b21lck5hbWVgLiBmaW5hbGx5IHdlIGhhdmUgYSB2YWx1ZSBgNTg5LjkxYCBiZXR3ZWVuIHRoZSBgaW52b2ljZWAgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcsIGluIHRoaXMgY2FzZSByZXByZXNlbnRpbmcgdGhlIGludm9pY2UgYW1vdW50LiANCg0KVG8gYmUgdXNhYmxlLCBYTUwgbXVzdCBiZSB3ZWxsIGZvcm1lZCBYTUwsIGEgd2VsbCBmb3JtZWQgWE1MIGhhcyB0aGUgZm9sbG93aW5nOiAgDQoNCiogQWxsIFhNTCBlbGVtZW50cyBtdXN0IGJlIGNvbnRhaW5lZCBpbiBvbmUgcm9vdCBlbGVtZW50ICANCiogRWFjaCBlbGVtZW50IG11c3QgaGF2ZSBhbiBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyAgDQoqIEVsZW1lbnRzIG11c3QgYmUgcHJvcGVybHkgbmVzdGVkDQoqIEF0dHJpYnV0ZXMgbXVzdCBiZSBxdW90ZWQgDQoNCkZvciBtb3JlIGFib3V0IFhNTCB3ZWxsIGZvcm1lZG5lc3MgW3NlZSBXM1NjaG9vbHMgWE1MIFR1dG9yaWFsXShodHRwczovL3d3dy53M3NjaG9vbHMuY29tL3htbC94bWxfdmFsaWRhdG9yLmFzcCl7dGFyZ2V0PSJfYmxhbmsifSAgDQoNCiMjIyBTdG9yaW5nIERhdGEgaW4gWE1MICANCkxldCdzIGFzc3VtZSB3ZSBoYXZlIGEgdGFibGUgb2YgaW52b2ljZXMgdGhhdCB3ZSBuZWVkIHRvIHN0b3JlIGluIFhNTCBmb3JtYXQgYW5kIHNlbmQgb3ZlciB0byBhbm90aGVyIGNvbXB1dGVyLCBmaXJzdCBsZXQncyBjb25zdHJ1Y3QgdGhlIHRhYmxlOiAgDQoNCmBgYHtyIGV4YW1wbGVfMV90YmwsIHJlc3VsdHM9J2hvbGQnfQ0KIyBHZW5lcmF0ZSBhIHRhYmxlLCBzYW1lIGFzIHByZXZpb3VzIHRlc3QgYnV0IDUwIHJvd3MNCnNldC5zZWVkKDQyKQ0KIyBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUNCnRhYmxlX3Jvd3MgPC0gMTAgDQojIEN1c3RvbWVyIG5hbWVzDQpjdXN0b21lcl9uYW1lcyA8LSBjKCJhYmMiLCAibW5vIiwieHl6IikNCiMgRGF0YSBmcmFtZQ0KdGJsXzEgPC0gZGF0YS5mcmFtZSgNCiAgQ3VzdG9tZXJOYW1lID0gc2FtcGxlKGN1c3RvbWVyX25hbWVzLCB0YWJsZV9yb3dzLCByZXBsYWNlID0gVCksDQogIEludm9pY2VOdW0gPSBzb3J0KHNhbXBsZSgxMDA6OTk5LCB0YWJsZV9yb3dzKSksDQogIEludm9pY2VEYXRlID0gc29ydChzYW1wbGUoc2VxKGFzLkRhdGUoJzIwMDAtMDEtMDEnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLkRhdGUoJzIwMDAtMTItMzEnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJkYXkiKSwgdGFibGVfcm93cykNCiAgICAgICAgICAgICAgICAgICAgICksDQogIEludm9pY2VDdXJyZW5jeSA9IHJlcCgiQ1UiLHRhYmxlX3Jvd3MpLA0KICBJbnZvaWNlQW10ID0gcm91bmQocnVuaWYodGFibGVfcm93cywgbWluID0gMTAwLCBtYXggPSAxMDAwKSwyKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQoNCiMgRGlzcGxheSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgZGF0YS5mcmFtZQ0KaGVhZCh0YmxfMSkNCmBgYA0KTm93IGxldCdzIGNvbnZlcnQgdGhhdCB0YWJsZSB0byBYTUwgZm9ybWF0OiAgDQpgYGB7ciBleGFtcGxlXzFfbWFrZV94bWwsIHJlc3VsdHM9J2hvbGQnfQ0KIyBUaGlzIGNvZGUgY29udmVydHMgdGhlIGludm9pY2VzIHRhYmxlIHRvIGFuIFhNTCBkb2N1bWVudCANCiMgYW5kIHNhdmVzIGl0IHRvIGZpbGUNCg0KIyBDcmVhdGUgWE1MIHJvb3QgZWxlbWVudA0KeG1sX3Jvb3QgPC0geG1sMjo6eG1sX25ld19yb290KCd0YWJsZScpDQoNCiMgQXR0YWNoIGVhY2ggcm93IG9mIHRoZSB0YWJsZSBhcyBhbiA8aW52b2ljZT4gZWxlbWVudA0KZm9yKHIgaW4gYXNwbGl0KHRibF8xLDEpKSB7DQogIG5kIDwtIHhtbDI6OnhtbF9hZGRfY2hpbGQoeG1sX3Jvb3QsICdpbnZvaWNlJykNCiAgZm9yKHJfbiBpbiBuYW1lcyhyKSl7DQogICAgeG1sMjo6eG1sX2FkZF9jaGlsZCgueD1uZCwgLnZhbHVlID0gcl9uLCByW1tyX25dXSApDQogIH0NCn0NCg0KIyBXcml0ZSB0aGUgWE1MIGRvY3VtZW50IHRvIGZpbGUNCnhtbF9vdXRfdGJsXzEgPC0gaGVyZTo6aGVyZSgneG1sX2ZpbGVzJywneG1sX291dC54bWwnKQ0KaW52aXNpYmxlKHhtbDI6OndyaXRlX3htbCh4bWxfcm9vdCwgeG1sX291dF90YmxfMSkpDQpgYGANCg0KVGhlIHJlc3VsdGluZyBYTUwgZmlsZSBsb29rcyBsaWtlIHRoaXM6ICANCmBgYHtyIGV4YW1wbGVfMV9zaG93X3htbCwgZWNobz1GQUxTRX0NCiMgcmVhZCBhbmQgZGlzcGxheSB0aGUgWE1MIGZpbGUNCm91dHB1dCA8LSBmbl9Db2RlQ2h1bmtPdXQobGFuZyA9ICJYTUwiLCBGaWxlID0geG1sX291dF90YmxfMSkNCm91dHB1dA0KYGBgDQoNCg0KRXhhbWluaW5nIHRoZSByZXN1bHRpbmcgWE1MIGZpbGUsIGVhY2ggYDxpbnZvaWNlPmAgZWxlbWVudCBoYXMgNSBjaGlsZCBlbGVtZW50cyBlYWNoIHJlcHJlc2VudGluZyBhIHBpZWNlIG9mIGRhdGEgcmVsYXRpbmcgdG8gdGhlIGludm9pY2UsIHdpdGggZWFjaCBvZiB0aG9zZSBjaGlsZCBlbGVtZW50cyBzdG9yaW5nIHRoZSBkYXRhIGFzIGl0cyB2YWx1ZS4gSWYgdGhlIGZvY3VzIG9mIHRoaXMgdGFibGUvcmVwb3J0IGlzIG9uIHRoZSBpbnZvaWNlIGFtb3VudCBgPGludm9pY2VBbXQ+YCwgdGhlbiBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gaGF2ZSB0aGUgaW52b2ljZSBhbW91bnQgaW5mb3JtYXRpb24gYXMgdGhlIG9ubHkgdmFsdWUsIGFuZCBldmVyeXRoaW5nIGVsc2UgbWlnaHQgYmUgYmV0dGVyIHJlcHJlc2VudGVkIGFzIGFuIGF0dHJpYnV0ZS4gQXR0cmlidXRlcyB1c3VhbGx5IHByb3ZpZGUgYWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbGVtZW50IGFuZCBpdHMgdmFsdWUsIHdlIG1heSBjYWxsIHRob3NlIGF0dHJpYnV0ZXMgYXNwZWN0cyBvciBldmVuIGRpbWVuc2lvbnMuIFNvIGxldCdzIHRyeSB0byByZXdyaXRlIHRoZSBYTUwgaW4gYSBkaWZmZXJlbnQgd2F5IHRvIHJlZmxlY3QgdGhpczoNCmBgYHtyIGV4YW1wbGVfMl9tYWtlX3htbCwgcmVzdWx0cz0naG9sZCd9DQojIFJlLXdyaXRlIHRoZSBYTUwgZmlsZSB3aXRoIGF0dHJpYnV0ZXMNCg0KIyBjcmVhdGUgcm9vdCBlbGVtZW50IGZvciB0aGUgbmV3IFhNTA0KeG1sX3Jvb3RfMiA8LSB4bWwyOjp4bWxfbmV3X3Jvb3QoJ3RhYmxlJykNCg0KIyBkZWZpbmUgY2hpbGRyZW4gd2l0aCBhdHRyaWJ1dGVzDQpmb3IociBpbiBhc3BsaXQodGJsXzEsMSkpIHsNCiAgbmQgPC0geG1sMjo6eG1sX2FkZF9jaGlsZCh4bWxfcm9vdF8yLCAnaW52b2ljZScsIHJbW2xlbmd0aChyKV1dKQ0KICBmb3Iocl9uIGluIG5hbWVzKHIpKXsNCiAgICB4bWwyOjp4bWxfYXR0cnMobmQpIDwtIHJbLWxlbmd0aChyKV0NCiAgfQ0KfQ0KDQojIFdyaXRlIHRoZSBYTUwgZG9jdW1lbnQgdG8gZmlsZQ0KeG1sX291dF90YmxfMiA8LSBoZXJlOjpoZXJlKCd4bWxfZmlsZXMnLCd4bWxfb3V0XzIueG1sJykNCmludmlzaWJsZSh4bWwyOjp3cml0ZV94bWwoeG1sX3Jvb3RfMiwgeG1sX291dF90YmxfMikpDQpgYGANCg0KVGhlIHJlc3VsdGluZyBOZXcgWE1MIGZpbGUgbG9va3MgbGlrZSB0aGlzOiAgDQpgYGB7ciBleGFtcGxlXzJfc2hvd194bWwsIGVjaG89RkFMU0V9DQojIHJlYWQgYW5kIGRpc3BsYXkgdGhlIFhNTCBmaWxlDQpvdXRwdXRfMiA8LSBmbl9Db2RlQ2h1bmtPdXQobGFuZyA9ICJYTUwiLCBGaWxlID0geG1sX291dF90YmxfMikNCm91dHB1dF8yDQpgYGANCg0KTm93IHRoYXQgd2UgaGF2ZSBtb2RlbGVkIG91ciBpbmZvcm1hdGlvbiBpbiBhbiBhY2NlcHRhYmxlIGZvcm0sIHdlIGNhbiB0cnkgdG8gcmUtY29uc3RydWN0IHRoZSB0YWJsZSBmcm9tIHRoZSBYTUwsIGhlcmUgSSBhbSB1c2luZyBgUiBzY3JpcHRgIGB4bWwyYCBsaWJyYXJ5IHRvIGRvIHRoYXQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBvbiBhbnkgc3lzdGVtIHVzaW5nIGFueSBsYW5ndWFnZSBvciBzb2Z0d2FyZSBjYXBhYmxlIG9mIHBhcnNpbmcgWE1MIGZpbGVzOg0KYGBge3IgZXhhbXBsZV8yX21ha2VfdGJsLCByZXN1bHRzPSdob2xkJ30NCiMgUmVhZCBYTUwgZmlsZQ0KeG1sX3RibCA8LSB4bWwyOjpyZWFkX3htbCh4bWxfb3V0X3RibF8yKQ0KDQojIGZpbmQgYWxsIGludm9pY2UgZWxlbWVudHMNCmludm9pY2VzIDwtIHhtbDI6OnhtbF9maW5kX2FsbCh4bWxfdGJsLCAnLi8vaW52b2ljZScpDQp2YWx1ZXMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKHhtbF90YmwsICcuLy9pbnZvaWNlL3RleHQoKScpICU+JSB4bWwyOjphc19saXN0KCkgJT4lIHVubGlzdCgpDQoNCiMgZXh0cmFjdCBpbnZvaWNlIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyBmcm9tIGFsbCBlbGVtZW50cyBhbmQgY29udmVydCB0byBhIGRhdGFmcmFtZQ0KeG1sX3RvX3RibCA8LSB4bWwyOjp4bWxfYXR0cnMoaW52b2ljZXMpICU+JSBiaW5kX3Jvd3MoKSAlPiUgDQogIG11dGF0ZShJbnZvaWNlQW10PSBhcy5kb3VibGUodmFsdWVzKSkgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KIyBDb3JyZWN0IGRhdGEgdHlwZXMNCnhtbF90b190YmwkSW52b2ljZU51bSA8LSBhcy5pbnRlZ2VyKHhtbF90b190YmwkSW52b2ljZU51bSkNCnhtbF90b190YmwkSW52b2ljZURhdGUgPC0gYXMuRGF0ZSh4bWxfdG9fdGJsJEludm9pY2VEYXRlKQ0KaGVhZCh4bWxfdG9fdGJsKQ0KIyBDb21wYXJlIHJlc3VsdCBvZiBjb252ZXJzaW9uIHRvIG9yaWdpbmFsIHRhYmxlDQpwYXN0ZSgiTWF0Y2hlcyBPcmlnaW5hbDogIiwgYWxsX2VxdWFsKHhtbF90b190YmwsIHRibF8xKSkgIyBTaG91bGQgcmV0dXJuIFRSVUUNCg0KYGBgDQoNCiMjIyBYTUwgU2NoZW1hLCBOYW1lc3BhY2VzIGFuZCBWYWxpZGF0aW9uICANCkFzIG1lbnRpb25lZCwgWE1MIGlzIHVzZWQgdG8gdHJhbnNwb3J0IGluZm9ybWF0aW9uIGJldHdlZW4gc3lzdGVtcywgYW5kIG5vdyB0aGF0IHdlIGhhdmUgYW4gWE1MIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoZSBuZXh0IHN0ZXAgd2lsbCBiZSB0byBzZW5kIGl0IHRvIHRoZSBkZXN0aW5hdGlvbiBzeXN0ZW0uIEJ1dCBhbiBpbXBvcnRhbnQgcXVlc3Rpb24gYXJpc2VzLCBob3cgZG8gd2UgbWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uL3JlY2VpdmluZyBzeXN0ZW0gaXMgYWJsZSB0byBoYW5kbGUgYW5kIHZlcmlmeSB0aGUgaW5mb3JtYXRpb24gaW4gb3VyIGRvY3VtZW50IGNvcnJlY3RseT8gRm9yIGV4YW1wbGUsIHRoZSByb290IGVsZW1lbnQgaW4gdGhlIGV4YW1wbGUgZG9jdW1lbnQgaXMgY2FsbGVkIGB0YWJsZWAsIHdoYXQgc2hvdWxkIGJlIGV4cGVjdGVkIHRvIGJlIGluY2x1ZGVkIGluIGEgdGFibGUgZWxlbWVudD8gSXMgaXQgYSB0YWJsZSBvZiBpbnZvaWNlcywgb3IgaXMgaXQgYSB0YWJsZSBhIHBpZWNlIG9mIGZ1cm5pdHVyZT8gIA0KDQpUbyBhZGRyZXNzIHRoZSBhYm92ZSBxdWVzdGlvbnMsIFhNTCBoYXMgbWVjaGFuaXNtcyB3aGVyZWJ5IGVsZW1lbnRzIGluIGFuIFhNTCBkb2N1bWVudCBjYW4gYmUgZGVzY3JpYmVkIGFuZCB2ZXJpZmllZCwgdGhlc2UgaXMgbWVjaGFuaXNtcyBtYWlubHkgZGVwZW5kIG9uIF9fc2NoZW1hX18sIF9fbmFtZXNwYWNlc19fIGFuZCBfX3R5cGVzX18uICANCg0KX19TY2hlbWFfXyBJcyBhIGNvbXBvbmVudCBvZiBYTUwgKFtXM0MgcmVjb21tZW5kYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9YTUwvU2NoZW1hKSkgdXNlZCB0byBkZXNjcmliZSBhbmQgdmFsaWRhdGUgZWxlbWVudHMgaW4gYW4gWE1MIGRvY3VtZW50LiBTY2hlbWEgY2FuIGJlIGRlc2NyaWJlZCBhcyB0aGUgYmx1ZXByaW50IG9mIHZvY2FidWxhcnkgdXNlZCwgd2hhdCBhbmQgaG93IGRhdGEgaXMgc3RvcmVkIGluIGFuIFhNTCBmaWxlLCBhbmQgd2hhdCBhcmUgdGhlIGRhdGEgdHlwZXMgb2Ygc3RvcmVkIGRhdGEuIHRoZXJlIGFyZSBkaWZmZXJlbnQgc2NoZW1hIGxhbmd1YWdlcyBzdWNoIGFzIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbnMgKERURHMpLCBSZWxheC1ORywgU2NoZW1hdHJvbiBhbmQgVzNDIFhTRCAoWE1MIFNjaGVtYSBEZWZpbml0aW9ucykuIFRoZSBmb2N1cyB3aWxsIGJlIG9uIFhTRCBhcyB0aGlzIGlzIHRoZSBTY2hlbWEgbGFuZ3VhZ2UgdXNlZCBpbiBYQlJMLiBYU0QgYmVpbmcgd3JpdHRlbiBpbiBYTUwsIGl0IGhhcyBvbmUgcm9vdCBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIHRoZSBkZWNsYXJhdGlvbnMsIHRoZSByb290IGVsZW1lbnQgaXMgYDxzY2hlbWE+YCBhbmQgaXQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtib3JkZXItc3R5bGU6IHNvbGlkO2JvcmRlci13aWR0aDogdGhpbjtib3JkZXItY29sb3I6ICNmN2Y3Zjc7Ij4NCiFbW1NjaGVtYSBFbGVtZW50IERlY2xhcmF0aW9uXShodHRwczovL3d3dy53My5vcmcvMjAwOS9YTUxTY2hlbWEvWE1MU2NoZW1hLnhzZCl7dGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJib3JkZXItY29sb3I6ICNjZWNlY2U7Ym9yZGVyLXN0eWxlOiBzb2xpZDtmb250LXNpemU6IGxhcmdlO2JvcmRlci13aWR0aDogdGhpbjtwYWRkaW5nOiA1cHg7In1dKGByIHBhc3RlMChoZXJlOjpoZXJlKCksJy9kb2NzL2ltYWdlcy9YTUxTY2hlbWFEaWFncmFtLnBuZycpYCl7c3R5bGU9ImRpc3BsYXk6IGJsb2NrO21hcmdpbi1sZWZ0OiBhdXRvO21hcmdpbi1yaWdodDogYXV0bzsifQ0KPC9kaXY+ICANCg0KX19OYW1lc3BhY2VzX18gSXMgYSBjb21wb25lbnQgb2YgWE1MIChbVzNDIHJlY29tbWVuZGF0aW9uXShodHRwczovL3d3dy53My5vcmcvVFIveG1sLW5hbWVzLykpIHVzZWQgZm9yIHByb3ZpZGluZyB1bmlxdWVseSBuYW1lZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiBhbiBYTUwgZG9jdW1lbnQuIFhNTCBkb2N1bWVudCBtYXkgY29udGFpbiBlbGVtZW50cyBmcm9tIG11bHRpcGxlIHZvY2FidWxhcmllcyAoc2NoZW1hKSwgbmFtZXNwYWNlcyBoZWxwIGluIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGVsZW1lbnRzIGZyb20gZGlmZmVyZW50IHZvY2FidWxhcmllcyBoYXZpbmcgaWRlbnRpY2FsIG5hbWVzLiBBIG5hbWVzcGFjZSB0YWtlcyB0aGUgZm9ybSBvZiBhIFVSSSwgZm9yIGV4YW1wbGUgYGh0dHA6Ly9teW5hbWVzcGFjZS5jb20vMS8xYC4gQSBuYW1lc3BhY2UgcHJlZml4IGNhbiBiZSBkZWNsYXJlZCBpbiBhbiBYTUwgZG9jdW1lbnQgdG8gcmVmZXIgdG8gc3BlY2lmaWMgbmFtZXNwYWNlIHVzaW5nIGBAeG1sbnNgIGF0dHJpYnV0ZSwgZm9yIGV4YW1wbGUgIGB4bWxuczpteW5zPWh0dHA6Ly9teW5hbWVzcGFjZS5jb20vMS8xYC4NCg0KX19UeXBlcyBhbmQgRGVyaXZhdGlvbiBpbiB4c2RfXyAgDQpFbGVtZW50cyBkZWNsYXJlZCBpbiBhbiB4c2Qgc2NoZW1hIGFyZSBiYXNlZCBvbiBYTUwgYnVpbHQtaW4gZGF0YSB0eXBlcywgb3IgdHlwZXMgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIHRoZXNlIGJ1aWx0LWluIHR5cGVzLiBUeXBlcyBpbiB4c2QgZGV0ZXJtaW5lcyB0aGUgdmFsdWUsIGNvbnRlbnQgYW5kIGNvbXBvc2l0aW9uIG9mIGVsZW1lbnRzLCBmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCB0aGF0IGhvbGRzIGEgYGRhdGVgIHZhbHVlIG1heSBtYWtlIHVzZSBvZiB0aGUgYnVpbHQtaW4gdHlwZSBgZGF0ZWAgYW5kIG1heSBiZSB0eXBlZCBieSBzZXR0aW5nIHRoZSBgdHlwZWAgYXR0cmlidXRlIGB0eXBlPWRhdGVgLiBXM0Mgc3BlY2lmaWNhdGlvbnMgZm9yIGRhdGEgdHlwZXMgaXMgYXZhaWxhYmxlIFtoZXJlXShodHRwczovL3d3dy53My5vcmcvVFIvMjAwMS9XRC14Zm9ybXMtMjAwMTA2MDgvc2xpY2U0Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gYW5kIFtoZXJlXShodHRwczovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sc2NoZW1hLTItMjAwNDEwMjgvZGF0YXR5cGVzLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uIEEgZGVwaWN0aW9uIG9mIGJ1aWx0LWluIGRhdGF0eXBlcyBoaWVyYXJjaHkgPHU+ZnJvbSBXM0Mgc3BlY2lmaWNhdGlvbnM8L3U+OiAgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2JvcmRlci1zdHlsZTogc29saWQ7Ym9yZGVyLXdpZHRoOiB0aGluO2JvcmRlci1jb2xvcjogI2Y3ZjdmNzttYXJnaW4tYm90dG9tOiAxNXB4OyI+DQohW1tGcm9tIFczQyB3ZWJzaXRlXShodHRwczovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sc2NoZW1hLTItMjAwNDEwMjgvZGF0YXR5cGVzLmh0bWwjYnVpbHQtaW4tZGF0YXR5cGVzKXt0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImJvcmRlci1jb2xvcjogI2NlY2VjZTtib3JkZXItc3R5bGU6IHNvbGlkO2ZvbnQtc2l6ZTogbGFyZ2U7Ym9yZGVyLXdpZHRoOiB0aGluO3BhZGRpbmc6IDVweDsifV0oYHIgcGFzdGUwKGhlcmU6OmhlcmUoKSwiL2RvY3MvaW1hZ2VzL3R5cGUtaGllcmFyY2h5LmdpZiIpYCl7c3R5bGU9ImRpc3BsYXk6IGJsb2NrO21hcmdpbi1sZWZ0OiBhdXRvO21hcmdpbi1yaWdodDogYXV0bzsifQ0KPC9kaXY+ICANCg0KXyoqTm90ZSoqIGBzdWJzdGl0dXRpb25Hcm91cGA6IEEgc3Vic3RpdHV0aW9uIGdyb3VwIGlzIGEgZmVhdHVyZSBvZiBYTUwgc2NoZW1hIHRoYXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGVsZW1lbnRzIHRoYXQgY2FuIHJlcGxhY2UgYW5vdGhlciBlbGVtZW50IGluIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSB0aGF0IHNjaGVtYS4gVGhlIHJlcGxhY2VhYmxlIGVsZW1lbnQgaXMgY2FsbGVkIHRoZSBoZWFkIGVsZW1lbnQgYW5kIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2NoZW1h4oCZcyBnbG9iYWwgc2NvcGUuIFRoZSBlbGVtZW50cyBvZiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaGVhZCBlbGVtZW50IG9yIGEgdHlwZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgaGVhZCBlbGVtZW504oCZcyB0eXBlLl8NCg0KR2l2ZW4gdGhhdCBYTUwgaW5zdGFuY2UgY2FuIGhhdmUgb25lIGFuZCBvbmx5IG9uZSByb290IGVsZW1lbnQsIHRoaXMgZWxlbWVudCB3aWxsIGluZXZpdGFibHkgaW5jbHVkZSBvdGhlciBlbGVtZW50cyB0aGF0IGhhdmUgbW9yZSBjb21wbGljYXRlZCBjb250ZW50IHRoYW4ganVzdCBob2xkaW5nIGEgdmFsdWUgb2YgYSBjZXJ0YWluIHR5cGUsIGFuZCBidWlsdC1pbiB0eXBlcyB3aWxsIG5vdCBiZSBlbm91Z2ggdG8gdHlwZSB0aGVzZSBlbGVtZW50cy4gVGhlIGFuc3dlciB0byB0aGF0IGlzIGluIHRoZSBgWGAgb2YgWE1MIHdoaWNoIHN0YW5kcyBmb3IgYGVYdGVuc2libGVgLCB4c2QgcHJvdmlkZXMgY2FwYWJpbGl0aWVzIGZvciBjcmVhdGluZyBuZXcgdHlwZXMgZGVyaXZlZCBmcm9tIGJ1aWx0LWluIHR5cGVzIG9yIG90aGVyIHR5cGVzIHRoYXQgYXJlIGFscmVhZHkgZGVyaXZlZCBmcm9tIGJ1aWx0LWluIHR5cGVzLiBfQSBTdW1tYXJ5IG9mIHR5cGUgZGVyaXZhdGlvbiBpbiBYU0QgaXMgYXMgZm9sbG93czpfIA0KDQpgYGB7ciB4bWxTY2hlbWFfdHlwZXNfZGVyaXZhdGlvbl9kaWFncmFtLCBlY2hvPUZBTFNFfQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KZGlncmFwaCAneHNkIHR5cGVzJyB7DQpncmFwaCBbc3BsaW5lcz1vcnRob10NCm5vZGUgW3NoYXBlPWJveCwgc3R5bGU9J2ZpbGxlZCcsIGNvbG9yPXRyYW5zcGFyZW50LCBmaWxsY29sb3I9JyNmNWY1ZjUnLCBmb250bmFtZT1IZWx2ZXRpY2EsIGZvbnRjb2xvcj0nIzJjM2U1MCddDQphW2xhYmVsPSd4c2QgVHlwZXMnXTsgYltsYWJlbD0nUHJpbWl0aXZlICYgQnVpbHQtaW4gdHlwZXMnXTsgY1tsYWJlbD1zaW1wbGVUeXBlc107IGRbbGFiZWw9Y29tcGxleFR5cGVzXQ0KDQpub2RlIFtzaGFwZT1ib3gsIHN0eWxlPSdmaWxsZWQscm91bmRlZCcsIGNvbG9yPXRyYW5zcGFyZW50LCBmaWxsY29sb3I9JyNmNWY1ZjUnLCBmb250bmFtZT1IZWx2ZXRpY2EsIGZvbnRjb2xvcj0nIzJjM2U1MCddDQpnW2xhYmVsPSdcXGwmIzgyMjY7IEJhc2VkIG9uIG90aGVyIHNpbXBsZSBUeXBlc1xcbCAmIzgyMjY7IENhbm5vdCBJbmNsdWRlIGF0dHJpYnV0ZXMgb3Igb3RoZXJcXGwmbmJzcDsmbmJzcDtlbGVtZW50cy5cXGwgJ107DQpoW2xhYmVsPSdBbGxvd2VkIGVsZW1lbnRzOlxcbCYjODIyNjsgPHJlc3RyaWN0aW9uPlxcbCYjODIyNjsgPGxpc3Q+XFxsJiM4MjI2OyA8dW5pb24+XFxsJ107DQppW2xhYmVsPSdJbmNsdWRlcyBhdHRyaWJ1dGVzIGFuZCB2YWx1ZSddOyBqW2xhYmVsPSdFbXB0eSBFbGVtZW50cyddOyBrW2xhYmVsPSdJbmNsdWRlcyBFbGVtZW50cyBPbmx5J107IGxbbGFiZWw9J01peGVkIEVsZW1lbnRzJ107DQptW2xhYmVsPSc8Y29tcGxleENvbnRlbnQ+XFxuJiM4MjI2OyA8cmVzdHJpY3Rpb24+XFxuJiM4MjI2OyA8ZXh0ZW5zaW9uPiddOyANCm5bbGFiZWw9JzxzaW1wbGVDb250ZW50PlxcbiYjODIyNjsgPHJlc3RyaWN0aW9uPlxcbiYjODIyNjsgPGV4dGVuc2lvbj4nXTsNCm9bZml4ZWRzaXplPXRydWUsIHdpZHRoPTQuNSwgaGVpZ2h0PS44NSwgIGxhYmVsPSdcXG5jb21wbGV4VHlwZXMgd2l0aG91dCBuZWl0aGVyXFxuc2ltcGxlQ29udGVudCBvciBjb21wbGV4dENvbnRlbnQgYXJlIGltcGxpY2l0bHlcXG5jb21wbGV4dENvbnRlbnQgd2l0aCByaXN0cmljdGlvbiAoc2VlIGhlcmUpLlxcbiZuYnNwOycsIFVSTCA9ICdodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9DUi14bWxzY2hlbWExMS0xLTIwMTEwNzIxL3N0cnVjdHVyZXMuaHRtbCNkY2wuY3RkLmN0Y2MuaW1wbGljaXQnXQ0KDQpub2RlW3NoYXBlPWJveCwgc3R5bGU9J2ZpbGxlZCwgcm91bmRlZCcsIGNvbG9yPXRyYW5zcGFyZW50LCBmaWxsY29sb3I9JyNkMWQxZDEnLCBmb250bmFtZT1IZWx2ZXRpY2EsIGZvbnRjb2xvcj0nIzJjM2U1MCddDQoNCmVkZ2VbY29sb3I9JyMyNDI0MjQnLCBwZW53aWR0aD0wLjJdDQoNCmEgLT4gYlthcnJvd2hlYWQ9bm9uZV0NCmEgLT4gY1thcnJvd2hlYWQ9bm9uZV0NCmEgLT4gZFthcnJvd2hlYWQ9bm9uZV0NCntyYW5rID0gc2FtZTsNCiAgYyAtPiBiW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZSwgbGFiZWwgPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXQ0KICBiIC0+IGRbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lLCBsYWJlbCA9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddDQp9DQp7DQogIGMgLT4gZ1thcnJvd2hlYWQ9bm9uZV0NCiAgZyAtPiBoDQp9DQp7DQogIGQtPiB7aSxqLGssbH1bYXJyb3doZWFkPW5vbmVdDQogIGktPiBuDQogIHtqLGssbH0gLT4gbQ0KICANCn0NCnsNCiAge20sbn0gLT4gb1thcnJvd2hlYWQ9bm9uZV0NCn0NCn0gICAgICAgICAgICAgICAgIA0KIiwgaGVpZ2h0PTM1MCwgd2lkdGg9IjEwMCUiKQ0KYGBgDQoNCkEgdXNlZnVsIHJlc291cmNlIG9uIHRoZSB0b3BpYyBvZiBYU0QgZGF0YSB0eXBlcyBhbmQgZGVyaXZhdGlvbiBpcyBhdmFpbGFibGUgW2hlcmVdKGh0dHBzOi8vd3d3LnhtbC5jb20vcHViL2EvMjAwMS8wOC8yMi9lYXN5c2NoZW1hLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uICANCg0KRm9sbG93aW5nIHdpdGggdGhlIGludm9pY2VzIHRhYmxlIGV4YW1wbGUsIGEgc2NoZW1hIHdhcyBjcmVhdGVkIGZvciB0aGlzIHJlcG9ydCAodXNpbmcgYW55IHNjaGVtYSBjcmVhdGlvbiBzb2Z0d2FyZSksIHRoZSBzY2hlbWEgaW5zdXJlcyB0aGUgZm9sbG93aW5nOiAgDQoNCiogTmFtZXNwYWNlIGBodHRwOi8vbXlwcm9qZWN0LmNvbS90ZXN0Mi8xYCB3YXMgZ2l2ZW4gdG8gcmVmZXIgdG8gdGhlIHZvY2FidWxhcnkgb2YgdGhlIHNjaGVtYSAgDQoqIFRoZSByb290IGVsZW1lbnQgaXMgY2FsbGVkIGB0YWJsZWAgYW5kIGNvbnRhaW5zIG9uZSBvciBtb3JlIGBpbnZvaWNlYCBlbGVtZW50ICANCiogRWFjaCBpbnZvaWNlIGVsZW1lbnQgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHNwZWNpZmljIHNldCBvZiBhdHRyaWJ1dGVzIGFzIGZvbGxvd3M6ICANCiAgKyBgQEludm9pY2VOdW1gIG9mIGRhdGEgdHlwZSBwb3NpdGl2ZSBpbnRlZ2VyDQogICsgYEBJbnZvaWNlRGF0ZWAgb2YgZGF0YSB0eXBlIGRhdGUgIA0KICArIGBASW52b2ljZUN1cnJlbmN5YCBhIHN0cmluZyB0aGF0IGNhbiBiZSBlaXRoZXIgIkNVIiBvciAiQ1giICANCiAgKyBgQEN1c3RvbWVyTmFtZWAgb2YgZGF0YSB0eXBlIHN0cmluZw0KICArIEZpbmFsbHkgaW52b2ljZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIDAgIA0KICANClNjaGVtYSBmaWxlIGlzIGFzIGZvbGxvd3M6DQpgYGB7ciBkaXNibGF5X3NjaGVtYV9maWxlLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmc9J1hNTCcsIEZpbGU9aGVyZTo6aGVyZSgneG1sX2ZpbGVzJywgJ2V4YW1wbGVfMl9zY2hlbWEyLnhzZCcpKQ0KYGBgDQoNCk5vdyB3ZSBuZWVkIHRvIGNoYW5nZSBvdXIgWE1MIGZpbGUgdG8gcmVmZXJlbmNlIHRoZSBzY2hlbWEsIHRoYXQgaXMgZG9uZSB1c2luZyB0aGUgYEB4bWxuc2AgYXR0cmlidXRlIGFuZCBnaXZpbmcgaXQgYSBuYW1lc3BhY2UgcHJlZml4IG9mICdpbnYnLCBhbmQgcHJvdmlkaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hIGZpbGUgdXNpbmcgYEB4czpzY2hlbWFMb2NhdGlvbmAgYXR0cmlidXRlLCBub3RlIHRoYXQgdGhlIGxhdGVyIGF0dHJpYnV0ZSBpcyBmcm9tIGB4cz1odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZWAgbmFtZXNwYWNlLiBUaGUgbmV3IGZpbGUgd2l0aCB0aGUgc2NoZW1hIHJlZmVyZW5jZSBpcyBuYW1lZCBgeG1sX291dF8yX3NjaGVtYS54bWxgIGFuZCBhbmQgdGhlIHJlbGV2YW50IHBhcnQgb2YgaXQgbG9va3MgYXMgZm9sbG93czogIA0KDQpgYGB7ciBkaXNibGF5X2ZpbGVfd2l0aF9zY2hlbWFfcmVmLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmc9J1hNTCcsIHR4dD0NCic8aW52OnRhYmxlIHhtbG5zOmludj0iaHR0cDovL215cHJvamVjdC5jb20vdGVzdDIvMSIgDQoJeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCgl4czpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL215cHJvamVjdC5jb20vdGVzdDIvMSBleGFtcGxlXzJfc2NoZW1hMi54c2QiPicpDQpgYGANCioqVmFsaWRhdGlvbiB3aXRoIG5vIGVycm9ycyoqICANCkJlZm9yZSBwcm9jZXNzaW5nIHRoZSBYTUwgZmlsZSwgdGhlIHJlY2VpdmluZyBjb21wdXRlciB3aWxsIGFsd2F5cyB2YWxpZGF0ZSB0aGUgWE1MIGZpbGUgYWdhaW5zdCB0aGUgcmVmZXJlbmNlZCBzY2hlbWEsIHdlIGNhbiBkbyB0aGF0IGhlcmUgdXNpbmcgYFIgc2NyaXB0YCBgeG1sMjo6eG1sX3ZhbGlkYXRlKClgIGZ1bmN0aW9uIGFzIGZvbGxvd3M6ICANCmBgYHtyIHRlc3RfMl92YWxpZGF0ZV8wLCAgcmVzdWx0cz0naG9sZCd9DQojIFJlYWQgWE1MIGluc3RhbmNlIGFuZCBzY2hlbWENCmluc3QgPC0geG1sMjo6cmVhZF94bWwoaGVyZTo6aGVyZSgieG1sX2ZpbGVzIiwieG1sX291dF8yX3NjaGVtYS54bWwiKSkNCnNjaGVtYSA8LSB4bWwyOjpyZWFkX3htbChoZXJlOjpoZXJlKCJ4bWxfZmlsZXMiLCJleGFtcGxlXzJfc2NoZW1hMi54c2QiKSkNCg0KIyBWYWxpZGF0ZSBYTUwgaW5zdGFuY2UgYWdhaW5zdCB0aGUgc2NoZW1hDQp4bWwyOjp4bWxfdmFsaWRhdGUoaW5zdCxzY2hlbWEpDQpgYGANClZhbGlkYXRpbmcgdGhlIGZpcnN0IGZpbGUgcmV0dXJucyBgVFJVRWAgd2l0aCAwIGVycm9ycywgbWVhbmluZyB0aGF0IHRoZSBmaWxlIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgc2NoZW1hLiANCg0KKipWYWxpZGF0aW9uIHdpdGggRXJyb3JzKiogIA0KTm93IGxldCdzIGNoYW5nZSB0aGUgZmlsZSBhbmQgdGVzdCBpZiB0aGUgdmFsaWRhdGlvbiB3aWxsIGRldGVjdCB0aGUgZXJyb3JzLiBXZSBjcmVhdGUgYSBuZXcgZmlsZSBjYWxsZWQgYHhtbF9vdXRfMl9zY2hlbWFfZXJyb3JzLnhtbGAsIGFuZCB3ZSBjaGFuZ2UgaXQgdG8gYmUgYXMgZm9sbG93czogIA0KDQoxLiBGb3IgdGhlIGZpcnN0IGludm9pY2UgcmVtb3ZlIGBAQ3VzdG9tZXJOYW1lYCBhdHRyaWJ1dGUgIC0+IHRlc3QgbWlzc2luZyBhdHRyaWJ1dGVzIGFyZSBkZXRlY3RlZA0KMi4gRm9yIHRoZSBzZWNvbmQgaW52b2ljZSBjaGFuZ2UgYEBJbnZvaWNlTnVtYCB2YWx1ZSB0byBzdHJpbmcgYGl4YC0+IHRlc3QgaW5jb25zaXN0ZW50IGF0dHJpYnV0ZSBkYXRhdHlwZSBpcyBkZXRlY3RlZCAgDQozLiBGb3IgdGhlIHRoaXJkIGludm9pY2UgY2hhbmdlIGBASW52b2ljZUN1cnJlbmN5YCB2YWx1ZSB0byBgWFpgIC0+IHRlc3Qgb25seSB2YWxpZCBjdXJyZW5jeSBjaG9pY2VzIGFyZSBhbGxvd2VkICANCjQuIGluIHRoZSBmb3VydGggaW52b2ljZSBjaGFuZ2UgdGhlIHZhbHVlIGZyb20gYDEzMy42OWAgdG8gYC0xMzMuNjlgIC0+IHRlc3QgaWYgb25seSBwb3NpdGl2ZSBpbnZvaWNlIGFtb3VudCB2YWx1ZXMgYXJlIGFsbG93ZWQuICANCg0KVGhlbiB3ZSBydW4gdGhlIHZhbGlkYXRpb24gYWdhaW4gb24gdGhlIG1vZGlmaWVkIGZpbGUsIHdlIHNob3VsZCBnZXQgYW4gZXJyb3IgdGhpcyB0aW1lOiAgDQpgYGB7ciB0ZXN0XzJfdmFsaWRhdGVfMSwgIHJlc3VsdHM9J2hvbGQnfQ0KIyBSZWFkIFhNTCBpbnN0YW5jZSBhbmQgc2NoZW1hIiwNCmluc3RfZXJyIDwtIHhtbDI6OnJlYWRfeG1sKGhlcmU6OmhlcmUoInhtbF9maWxlcyIsInhtbF9vdXRfMl9zY2hlbWFfZXJyb3JzLnhtbCIpKQ0Kc2NoZW1hIDwtIHhtbDI6OnJlYWRfeG1sKGhlcmU6OmhlcmUoInhtbF9maWxlcyIsImV4YW1wbGVfMl9zY2hlbWEyLnhzZCIpKQ0KDQojIFZhbGlkYXRlIFhNTCBpbnN0YW5jZSBhZ2FpbnN0IHRoZSBzY2hlbWENCnhtbDI6OnhtbF92YWxpZGF0ZShpbnN0X2VycixzY2hlbWEpDQoNCmBgYA0KQXMgc2hvd24gYWJvdmUsIGEgc2ltcGxlIFhNTCB2YWxpZGF0b3IgKHhtbDIpIGRldGVjdGVkIGFsbCB0aGUgZXJyb3JzIGFuZCByZXBvcnRlZCB0aGVtLiAgDQoNCiMjIyBYTGluayBhbmQgWFBvaW50ZXIgIA0KWExpbmsgYW5kIFhQb2ludGVyIGFyZSBjb21wb25lbnRzIHByb3ZpZGVkIGJ5IFhNTCwgdGhlc2UgY29tcG9uZW50cyBjYW4gYmUgdXNlZCB0byBsaW5rIFhNTCBlbnRpdGllcyB3aXRoIGVhY2ggb3RoZXIgd2l0aGluIFhNTCBvciB0byBleHRlcm5hbCByZXNvdXJjZXMuICANCg0KX19YTGlua19fIGlzIGEgW1czQyByZWNvbW1lbmRhdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3hsaW5rMTEvKSBzb21lIHdoYXQgbGlrZSBoeXBlcmxpbmsgaW4gSFRNTDogDQoNCj4gWE1MIExpbmtpbmcgTGFuZ3VhZ2UgKFhMaW5rKSBWZXJzaW9uIDEuMSwgd2hpY2ggYWxsb3dzIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkIGludG8gWE1MIGRvY3VtZW50cyBpbiBvcmRlciB0byBjcmVhdGUgYW5kIGRlc2NyaWJlIGxpbmtzIGJldHdlZW4gcmVzb3VyY2VzLiBJdCB1c2VzIFhNTCBzeW50YXggdG8gY3JlYXRlIHN0cnVjdHVyZXMgdGhhdCBjYW4gZGVzY3JpYmUgbGlua3Mgc2ltaWxhciB0byB0aGUgc2ltcGxlIHVuaWRpcmVjdGlvbmFsIGh5cGVybGlua3Mgb2YgdG9kYXkncyBIVE1MLCBhcyB3ZWxsIGFzIG1vcmUgc29waGlzdGljYXRlZCBsaW5rcy4gYHIgdHVmdGU6OnF1b3RlX2Zvb3RlcignLS0tIFtXMy5vcmcgWExpbmsgcmVjb21tZW5kYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bGluazExLyNhYnN0cmFjdCknKWAgIA0KDQpfX1hQb2ludGVyX18gaXMgYSBbVzNDIHJlY29tbWVuZGF0aW9uXShodHRwczovL3d3dy53My5vcmcvVFIveHB0ci8pIGlzIGEgY29uc3RydWN0IHRoYXQgYWxsb3dzIGZvciBsb2NhdGluZyBzcGVjaWZpYyBmcmFnbWVudCB3aXRoaW4gWE1MLiAgDQoNCkl0IGlzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCBYTUwgYW5kIGl0cyBjb21wb25lbnRzIGFyZSBqdXN0IGluc3RydWN0aW9ucywgdGhleSBkbyBub3RoaW5nIG90aGVyIHRoYW4gdHJhbnNwb3J0aW5nIGluZm9ybWF0aW9uLiBGb3IgdGhlIFhMaW5rIGFuZCBYUG9pbnRlciBjb21wb25lbnRzIHRvIGhhdmUgYW4gZWZmZWN0LCBpdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gWE1MIHByb2Nlc3Nvci4gIA0KDQpHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSB0d28gbWFpbiBjYXRlZ29yaWVzIG9mIGxpbmtzOiAgDQoNCiogYFNpbXBsZSBMaW5rc2A6IEEgc2ltcGxlIGxpbmsgaW4gWExpbmsgY3JlYXRlcyBhIHVuaWRpcmVjdGlvbmFsIGh5cGVybGluayBmcm9tIG9uZSBlbGVtZW50IHRvIGFub3RoZXIgdGhyb3VnaCBhIFVSSS4gVGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbGluayAodGhlIHNvdXJjZSBlbGVtZW50KSBpcyBsaW5rZWQgdG8gYSBkZXN0aW5hdGlvbiBlbGVtZW50LiBUaGlzIGRlc3RpbmF0aW9uIGVsZW1lbnQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgc291cmNlIGVsZW1lbnQuIFRoaXMgaXMgY29tbW9uIGluIEhUTUwgaHlwZXJsaW5raW5nLCB3aGVyZSBhIGxpbmsgb24gb25lIHdlYnNpdGUgbWF5IGxlYWQgYSB1c2VyIHRvIGFuIGFkZGl0aW9uYWwgd2Vic2l0ZSwgYnV0IHRoYXQgYWRkaXRpb25hbCB3ZWJzaXRlIG1heSBub3QgY29udGFpbiBhIGxpbmsgYmFjayB0byB0aGUgc291cmNlIGxvY2F0aW9uLiAgDQoNCiogYEV4dGVuZGVkIExpbmtzYDogUHJvdmlkZSBmb3IgbXVsdGlwbGUgcmVzb3VyY2VzIGF0IHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gdG8gYmUgY29ubmVjdGVkIHZpYSBtdWx0aXBsZSBhcmNzLiBBbiBhcmMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbiwgZGVzdGluYXRpb24sIGFuZCB0aGUgYmVoYXZpb3Igb2YgYSBsaW5rIGJldHdlZW4gdHdvIHJlc291cmNlcy4gVGhlIG9yaWdpbiByZXNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlIGFyZSBkZWZpbmVkIGJ5IGxhYmVscy4gKipfVGhyb3VnaCBvbmUgb3IgbW9yZSBhcmNzLCBleHRlbmRlZCBsaW5rcyBhY2hpZXZlIGNvbXBsZXggY29ubmVjdGlvbnMgYW1vbmcgbXVsdGlwbGUgcmVzb3VyY2VzXyoqLiBMaWtlIHNpbXBsZSBsaW5rcywgZXh0ZW5kZWQgbGlua3MgY2FuIGRlZmluZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gZWxlbWVudHMgd2l0aGluIHRoZSBzYW1lIG5hbWVzcGFjZSBvciBhY3Jvc3MgZGlmZmVyZW50IG5hbWVzcGFjZXMuIA0KDQpGb2xsb3dpbmcgYXJlIGRpYWdyYW1zIGZvciB0aGUgdHlwZSBkZWZpbml0aW9ucyBmb3Igc2ltcGxlIGFuZCBleHRlbmRlZCBsaW5rcyBpbiBuYW1lc3BhY2UgYHtodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rfWA6DQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtTaW1wbGUgVHlwZV0oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMvc2ltcGxlTGlua1R5cGUucG5nJylgKQ0KPC9jZW50ZXI+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KKipTaW1wbGUgVHlwZSBEZWNsYXJhdGlvbioqDQo8L3A+DQo8L2Rpdj4NCjxkaXY+DQo8Y2VudGVyPg0KIVtFeHRlbmRlZCBUeXBlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9leHRlbmRlZExpbmtFbGVtZW50LnBuZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqRXh0ZW5kZWQgVHlwZSBEZWNsYXJhdGlvbioqDQo8L3A+DQo8L2Rpdj4NCg0KDQoqKlhMaW5rIGFuZCBYUG9pbnRlciBFeGFtcGxlKiogIA0KVGhlcmUgaXMgbm8gYnJvd3NlciBzdXBwb3J0IGZvciBYTUwgWExpbmssIGJ1dCB0aGUgYmVzdCB3YXkgdG8gc2ltdWxhdGUgaXQgYW5kIHVuZGVyc3RhbmQgdGhlIGlkZWEgb2YgWExpbmsgYW5kIFhQb2ludGVyIGlzIHRvIHVzZSBoeXBlcmxpbmtzLCAgQ2xpY2sgdGhpcyBsaW5rOiBbaHR0cHM6Ly93d3cudzMub3JnL1RSL3hsaW5rMTEvI2Fic3RyYWN0XShodHRwczovL3d3dy53My5vcmcvVFIveGxpbmsxMS8jYWJzdHJhY3Qpe3RhcmdldD1fYmxhbmt9ICANCg0KV2Ugc2hvdWxkIGJlIHRha2VuIHRvIHRoZSBYTGluayByZWNvbW1lbmRhdGlvbiBvbiB0aGUgVzNDIHdlYnNpdGUgYXQgdGhlIGxvY2F0aW9uIG9mIGBBYnN0cmFjdGAsIHdoYXQgaGFwcGVuZWQgaGVyZSBpcyB0aGF0IHRoZSBicm93c2VyIHJlY29nbml6ZWQgdGhlIGh5cGVybGluayAoWExpbmspIGFuZCB0aGVuIHRoZSBsb2NhdG9yIGdpdmVuIGFmdGVyIHRoZSBgI2Agc3ltYm9sIChYUG9pbnRlcikgYW5kIGV4ZWN1dGVkIHRoZSBpbnN0cnVjdGlvbnMsIGFuZCBpbiB0aGlzIGNhc2UgdGhlIGluc3RydWN0aW9ucyB3YXMgdG8gb3BlbiB0aGUgd2Vic2l0ZSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLCBzbyB3ZSB3ZXJlIGFibGUgdG8gbGluayBmb3JtIHRoaXMgcGFnZSB0byBhbm90aGVyIGV4dGVybmFsIHBhZ2UuIEluIFhNTCBYTGluayB3b3JrcyB0aGUgc2FtZSB3YXksIGl0IGxpbmtzIGVsZW1lbnRzIHRvIG90aGVyIGVsZW1lbnRzLCBvciBleHRlcm5hbCByZXNvdXJjZXMgd2l0aCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgYW5kIHR5cGVzIG9mIGxpbmtzIHVzZWQuDQoNCiMjIyBDb25jbHVzaW9uICANClhNTCBsYW5ndWFnZSBhbmQgc3RhbmRhcmRzIHRoYXQgcHJvdmlkZXMgZm9yOiAgDQoNCiogRmxleGliaWxpdHkgaW4gZGF0YSBtb2RlbGluZyAgDQoqIE1lY2hhbmlzbXMgZm9yIGNyZWF0aW5nIHZvY2FidWxhcmllcyAoZGljdGlvbmFyaWVzKSAgDQoqIE1lY2hhbmlzbXMgdG8gdmFsaWRhdGUgWE1MIGNvbnRlbnQgIA0KKiBNZWNoYW5pc21zIHRvIGxpbmsgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGNvbXBvbmVudHMNCg0KSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLCBYTUwgaXMgYSBzdGFibGUgYW5kIHdpZGVseSB1c2VkIGxhbmd1YWdlLCBhbmQgYWxsIHRoYXQgbWFkZSBYTUwgc3VpdGFibGUgZm9yIHRoZSBvYmplY3RpdmVzIG9mIFhCUkwuICANCg0KDQojIyBIb3cgRG9lcyBYQlJMIFJlcHJlc2VudCBEYXRhICANCg0KTm93IHRoYXQgd2UgYXJlIGZhbWlsaWFyIHdpdGggWE1MLCB3ZSBjYW4gZ2V0IGludG8gdGhlIG1lY2hhbmlzbXMgb2YgaG93IFhCUkwgcmVwcmVzZW50IGRhdGEuIEluIHRoaXMgc2VjdGlvbiB3ZSBmaXJzdCBoYXZlIGFuIG92ZXJ2aWV3IG9mIHRoZSBjb21wb25lbnRzIGFuZCBzcGVjaWZpY2F0aW9ucyBvZiBYQlJMLCBzb21lIGJhc2ljIGNvbmNlcHRzIG9mIGhvdyBYQlJMIHJlcHJlc2VudHMgZGF0YSwgZmluYWxseSB3ZSBsb29rIGF0IHJlYWwgbGlmZSBYQlJMIGV4YW1wbGVzLiAgDQoNCl9JdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IFhCUkwgdGF4b25vbWllcyBpbnN0YW5jZSBkb2N1bWVudHMgYXJlIHVzdWFsbHkgY3JlYXRlZCB1c2luZyBzcGVjaWFsaXplZCBzb2Z0d2FyZSB0aGF0IHByb3ZpZGVzIGZvciBhIHVzZXIgZnJpZW5kbHkgaW50ZXJmYWNlIHdoaWxlIHRoZSBzb2Z0d2FyZSB0YWtlcyBjYXJlIG9mIHRoZSBmb3JtIGFuZCBzeW50YXggYmVoaW5kIHRoZSBzY2VuZSwgc3RpbGwgaXQgaXMgaW1wb3J0YW50IHRvIGhhdmUga25vd2xlZGdlIG9mIHRoZSBlbGVtZW50cyBhbmQgY29tcG9uZW50cyBkZWZpbmVkIGluIFhCUkwgc3BlY2lmaWNhdGlvbnMuXw0KDQojIyMgWEJSTCBDb21wb25lbnRzICANClRoZSBmaWd1cmUgYmVsb3cgdHJpZXMgdG8gdmlzdWFsaXplIHRoZSBpbmdyZWRpZW50cyBuZWVkZWQgdG8gZW5kIHVwIHdpdGggWEJSTCByZXBvcnQgKHN0cnVjdHVyZWQgZmluYW5jaWFsIHJlcG9ydCk6ICANCg0KPGRpdj4NCjxjZW50ZXI+DQohW1hCUkwgQ29tcG9uZW50c10oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMveGJybF9jb21wb25lbnRzLnN2ZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqWEJSTCBDb21wb25lbnRzKioNCjwvcD4NCjwvZGl2Pg0KDQpgYGB7ciB4YnJsX2NvbXBvbmVudHMsIGVjaG89RkFMU0UsICB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFLCBmaWcuY2FwPSdYQlJMIENvbXBvbmVudHMnfQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KDQpkaWdyYXBoIG1hdHJpeCB7DQoNCiAgZ3JhcGggW3NwbGluZXM9b3J0aG8sIHJhbmtkaXI9QlQsIGxhYmVsPSdYQlJMIENvbXBvbmVudHMnLCBub2Rlc2VwPTAuMDUsIHJhbmtzZXA9MC4wMiwgZm9udG5hbWU9SGVsdmV0aWNhXQ0KICANCiAgbm9kZSBbc2hhcGU9Ym94LCBzdHlsZT0nZmlsbGVkJywgY29sb3I9dHJhbnNwYXJlbnQsIGZpbGxjb2xvcj0nI2Y1ZjVmNScsIGZvbnRuYW1lPUhlbHZldGljYSwgZm9udGNvbG9yPScjMmMzZTUwJ10NCiAgDQogIGFbbGFiZWw9J1hNTCcsIHdpZHRoPTkuMywgZmlsbGNvbG9yPScjZDlkOWQ5J107IA0KICBiW2xhYmVsPSdYQlJMIFNwZWNpZmljYXRpb25zJywgd2lkdGg9OS4zLCBmaWxsY29sb3I9JyNkOWQ5ZDknXTsgDQogIGNbbGFiZWw9J2RpY3Rpb25hcnkvdm9jYWJ1bGFyeScsIHdpZHRoPTkuMSwgZmlsbGNvbG9yPScjZTZlNmU2J107IA0KICBkW2xhYmVsPSdFeHRlbnNpb25zJywgd2lkdGg9MywgZmlsbGNvbG9yPScjZTZlNmU2J107IA0KICBlW2xhYmVsPSdUeXBlIERlZmluaXRpb25zJywgd2lkdGg9MywgZmlsbGNvbG9yPScjZTZlNmU2J107IA0KICBmW2xhYmVsPSdMaW5rYmFzZXMnLCB3aWR0aD00LjUsIGZpbGxjb2xvcj0nI2U2ZTZlNiddOyANCiAgZ1tsYWJlbD0nT3RoZXIgSW1wb3J0ZWQgVGF4b25vbWllcycsIHdpZHRoPTMsIGZpbGxjb2xvcj0nI2U2ZTZlNiddOw0KICBoW2xhYmVsPSdPdGhlciBSZXNvdXJjZXMnLCB3aWR0aD00LjUsIGZpbGxjb2xvcj0nI2U2ZTZlNiddOw0KICBpW2xhYmVsPSdSZXBvcnQgU3BlY2lmaWMgVGF4b25vbXkgRXh0ZW5zaW9ucyBhbmQgTGlua2Jhc2VzIChpZiBhbGxvd2VkKScsIHdpZHRoPTkuMSwgZmlsbGNvbG9yPScjZjVmNWY1J10NCiAgaltsYWJlbD0nWEJSTCBJbnN0YW5jZSAoUmVwb3J0KScsIHdpZHRoPTkuMSwgZmlsbGNvbG9yPScjZjVmNWY1J10NCiAga1tsYWJlbD0nQ29uc3VtZXIgRGF0YSBNb2RlbChzKScsIGZpbGxjb2xvcj0nI2ZjZmNmYycsIHdpZHRoPTkuM10NCiAgeFt3aWR0aD0wLCBsYWJlbD0nJywgc3R5bGU9aW52aXNdDQoNCiAgDQogIGVkZ2VbY29sb3I9JyMyNDI0MjQnLCBwZW53aWR0aD0wLjJdDQogIA0KICBhIC0+IGJbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICBiIC0+IGRbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICBiIC0+IGVbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICBiIC0+IGdbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICBzdWJncmFwaCBjbHVzdGVyMCB7DQogICAgZ3JhcGggW3JhbmtkaXI9QlQsIGxhYmVsPSdYQlJMIFRheG9ub215JywgY29sb3IgPSBjcmltc29uXTsNCiAgICB7IA0KICAgICAgICByYW5rPXNhbWU7DQogICAgICAgIGcgLT4gZFtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogICAgICAgIGcgLT4gZVtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogICAgICAgDQogICAgfQ0KICAgIA0KICAgICBkIC0+IGNbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICAgICBlIC0+IGNbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICAgICBnIC0+IGNbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICANCiAgICB7DQogICAgICAgIHJhbms9c2FtZTsNCiAgICAgICAgaCAtPiBmW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgICAgICAgaCAtPiB4W3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgICB9IA0KICAgIGMgLT4gaFtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogICAgYyAtPiBmW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgICBjIC0+IHhbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICB9DQogIHN1YmdyYXBoIGNsdXN0ZXIxIHsNCiAgICBncmFwaCBbcmFua2Rpcj1CVCwgbGFiZWw9J1hCUkwgUmVwb3J0IHBhY2thZ2UnLCBjb2xvciA9IGNyaW1zb25dOw0KICAgIGkgLT4galtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogIH0NCiAgaCAtPiBpW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgZiAtPiBpW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgeCAtPiBpW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgaiAtPiBrW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgDQoNCn0gICAgICAgICAgICAgICAgIA0KIiwgaGVpZ2h0PSIxMDAlIiwgd2lkdGg9IjEwMCUiKQ0KYGBgDQoNCjEuIEF0IHRoZSBiYXNlLCB3ZSBoYXZlICoqWE1MKiosIHRoZSBmb3VuZGF0aW9uIGZvciBldmVyeXRoaW5nIGVsc2UuICANCjIuIFsqKlhCUkwgc3BlY2lmaWNhdGlvbnMqKl0oI3hicmwtc3BlY3MpIGFyZSBiYXNlZCBvbiBYTUwsIGFuZCB0aGVzZSBzcGVjaWZpY2F0aW9ucyBwcm92aWRlIHRoZSBidWlsZGluZyBibG9ja3MgZm9yIGEgcmVwb3J0aW5nIHN5c3RlbSBiYXNlZCBvbiBYQlJMLiAgDQozLiAqKlhCUkwgVGF4b25vbXkqKiBpcyB0aGUgbW9zdCBjcml0aWNhbCBpbmdyZWRpZW50LCBpdCB1c2VzIFhCUkwgc3BlY2lmaWNhdGlvbnMgdG8gYnVpbGQgdGhlIHN0cnVjdHVyZSBhbmQgdGhlIGRhdGEgbW9kZWwgZm9yIFhCUkwgcmVwb3J0aW5nLCB3ZSBjYW4gdGhpbmsgb2YgYSBUYXhvbm9teSBhcyB0aGUgU2NoZW1hIGZvciBhIHBhcnRpY3VsYXIgcmVwb3J0aW5nIGRvbWFpbi4gWEJSTCBUYXhvbm9teSBjb25zaXN0cyBvZjogIA0KICAgICogX19EaWN0aW9uYXJ5L1ZvY2FidWxhcnlfXyBvZiBlbGVtZW50cyB0byBiZSB1c2VkIGluIHJlcG9ydGluZywgaW4gWEJSTCB0ZXJtaW5vbG9neSwgdGhlc2UgYXJlIGNhbGxlZCBfIkNvbmNlcHRzIl8uICANCiAgICAqIF9fVHlwZSBEZWZpbml0aW9uc19fIGFyZSBjb21wb25lbnRzIG9yIGV4dGVuc2lvbiBvZiBleGlzdGluZyBjb21wb25lbnRzIHRoYXQgYXJlIHRoZSBidWlsZGluZyBibG9ja3Mgb2YgQ29uY2VwdHMuICANCiAgICAqIF9fTGlua2Jhc2VzX18gYXJlIGdyb3VwcyBvZiBYbGlua3MgdGhhdCBsaW5rcyBjb25jZXB0cyB0b2dldGhlciB0byBmb3JtIGEgbG9naWNhbCBzdHJ1Y3R1cmUgc3VjaCBhcyBfUHJlc2VudGF0aW9uIExpbmtiYXNlXyB1c2VkIHRvIGxpbmsgY29uY2VwdCB0b2dldGhlciBpbiBmb3JtIHRvIGVuYWJsZSBjb3JyZWN0IGhpZXJhcmNoaWNhbCBwcmVzZW50YXRpb24gb2YgdGhlc2UgY29uY2VwdHMgaW4gYSByZXBvcnQgb3IgYW55IGZvcm0gb2YgcmVuZGVyaW5nLiAgDQogICAgKiBfX090aGVyIEltcG9ydGVkIFRheG9ub21pZXNfXyBYQlJMIHRheG9ub21pZXMgY2FuIGltcG9ydCBvdGhlciB0YXhvbm9taWVzIHRvIGJlIHBhcnQgb2YgdGhlIGJhc2UgdGF4b25vbXksIHRoaXMgbWVjaGFuaXNtIGFsbG93cyBmb3IgcmV1c2luZyBleGlzdGluZyB0YXhvbm9taWVzIHJhdGhlciB0aGFuIHJlY3JlYXRpbmcgc29tZXRoaW5nIHRoYXQgYWxyZWFkeSBleGl0cy4gQWxsIHRheG9ub21pZXMgaW1wb3J0ZWQgYnkgdGhlIGJhc2UgdGF4b25vbXkgYW5kIGFueSBvdGhlciB0YXhvbm9taWVzIHRoYXQgaW1wb3J0ZWQgdGF4b25vbWllcyBpbXBvcnQgYWxsIHRvZ2V0aGVyIGFyZSBjYWxsZWQgKipEaXNjb3ZlcmFibGUgVGF4b25vbXkgU2V0IChEVFMpKiouIEFuIGV4YW1wbGUgZm9yIHRoYXQgaXMgdGhlIFVTLUdBQVAgdGF4b25vbXkgd2hpY2ggaW1wb3J0cyBTdG9jayBFeGNoYW5nZSBDb21taXNzaW9uIChTRUMpIHRheG9ub21pZXMuIFNvbWUgb2YgdGVybWlub2xvZ3kgcmVsZXZhbnQgdG8gVGF4b25vbXkgKFtfYmFzZWQgb24gWEJSTCBHbG9zc2FyeV0oaHR0cHM6Ly93d3cueGJybC5vcmcvZ3VpZGFuY2UveGJybC1nbG9zc2FyeS8pKTogIA0KICAgIA0KICAgICAgKyBfX0Jhc2UgVGF4b25vbXlfXzogQSB0YXhvbm9teSB0aGF0IGlzIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBhbiBleHRlbnNpb24gdGF4b25vbXkuICANCiAgICAgICsgX19FeHRlbnNpb24gVGF4b25vbXlfXzogQSB0YXhvbm9teSB0aGF0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIG9uZSBvciBtb3JlIG90aGVyIHRheG9ub21pZXMgKGEgYmFzZSB0YXhvbm9teSkgYXMgYSBzdGFydGluZyBwb2ludC4gRXh0ZW5zaW9uIHRheG9ub21pZXMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50IGVudGl0eSBmcm9tIHRoZSBhdXRob3Igb2YgdGhlIGJhc2UgdGF4b25vbXkuIEV4dGVuc2lvbiB0YXhvbm9taWVzIG1heSBiZSBjcmVhdGVkIGJ5IHByZXBhcmVycyAoc2VlIGVudGl0eS1zcGVjaWZpYyBleHRlbnNpb24gdGF4b25vbXkpICwgb3IgdGhleSBtYXkgYmUgY3JlYXRlZCBieSBhIGNvbGxlY3RvciBtYWtpbmcgdXNlIG9mIGEgdGF4b25vbXkgZnJvbSBhIHRoaXJkIHBhcnR5IHN1Y2ggYXMgYW4gYWNjb3VudGluZyBzdGFuZGFyZHMgYm9keS4gIA0KICAgICAgKyBfX0VudGl0eS1zcGVjaWZpYyBleHRlbnNpb24gdGF4b25vbXlfXzogQW4gZXh0ZW5zaW9uIHRheG9ub215IHRoYXQgaXMgY3JlYXRlZCBieSB0aGUgcHJlcGFyZXIgb2YgYW4gWEJSTCByZXBvcnQgaW4gb3JkZXIgdG8gZGlzY2xvc2UgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgcmVwb3J0aW5nIGVudGl0eSAoc2VlIGVudGl0eS1zcGVjaWZpYyBkaXNjbG9zdXJlKS4NCiAgICAgICsgX19UYXhvbm9teSBFbnRyeSBQb2ludF9fOiBBIHRheG9ub215IGVudHJ5IHBvaW50IGlkZW50aWZpZXMgYSBzdWJzZXQgKG9yICJ2aWV3Iikgb2YgYSB0YXhvbm9teS4gVGF4b25vbWllcyB3aWxsIG9mdGVuIHByb3ZpZGUgbXVsdGlwbGUgdmlld3MgZm9yIGRpZmZlcmVudCwgcmVsYXRlZCByZXBvcnRpbmcgcHVycG9zZXMuIEZvciBleGFtcGxlLCBhIHRheG9ub215IG1heSBjYXRlciBmb3IgZGlmZmVyZW50IGluZHVzdHJpZXMgcmVwb3J0aW5nIHVuZGVyIHRoZSBzYW1lIGFjY291bnRpbmcgc3RhbmRhcmQuIEEgdGF4b25vbXkgZW50cnkgcG9pbnQgaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBVUkwgKG9yIHNldCBvZiBVUkxzKSwgYW5kIGlzIHdoYXQgaXMgcmVmZXJlbmNlZCBieSBhbiBYQlJMIHJlcG9ydCBvciBhbiBleHRlbnNpb24gdGF4b25vbXkuICANCiAgICAqIF9fRXh0ZW5zaW9uc19fIHRvIG90aGVyIHRheG9ub21pZXMgbWF5YmUgcGFydCBvZiB0aGUgYmFzZSB0YXhvbm9teS4gIA0KICAgICogX19PdGhlciBSZXNvdXJjZXNfXyBzdWNoIGFzIGRvY3VtZW50YXRpb24gYW5kIHJlZmVyZW5jZXMgbWF5IGJlIGluY2x1ZGVkIGluIGFuIFhCUkwgVGF4b25vbXkuICANCjQuICoqWEJSTCBSZXBvcnQqKiBjb25zaXN0cyBvZjogIA0KICAgIA0KICAgICogX1NjaGVtYV8gY29udGFpbmluZyBhbnkgZXh0ZW5zaW9uIHRvIHRoZSBiYXNlIHRheG9ub215IGlmIGV4dGVuc2lvbiBpcyBhbGxvd2VkLiAgDQogICAgKiBfTGlua2Jhc2VzXyByZWxldmFudCB0byB0aGUgcmVwb3J0LiAgDQogICAgKiBfSW5zdGFuY2UgRG9jdW1lbnRfIGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCByZXBvcnQuICANCjUuICoqQ29uc3VtZXIgRGF0YSBNb2RlbCoqIGlzIHdoZXJlIHRoZSBkYXRhIHRyYW5zcG9ydGVkIGJ5IFhCUkwgZW5kcyB1cCwgdGF4b25vbWllcyBtdXN0IGNvbnNpZGVyIGNvbnN1bWVyIGRhdGEgbmVlZHMgaW4gaXRzIGRlc2lnbi4gDQoNCiMjIyBYQlJMIFNwZWNpZmljYXRpb25zeyN4YnJsLXNwZWNzfSAgDQpBcyBleHBsYWluZWQgcHJldmlvdXNseSBYQlJMIGlzIGFuIGV4dGVuc2lvbiBvZiBYTUwsIGJhc2ljYWxseSBYQlJMIGludGVybmF0aW9uYWwgdXNlZCBYTUwgdG8gZGVmaW5lIFhCUkwgY29tcG9uZW50cyBhbmQgZWxlbWVudHMgYW5kIHRoZSByZXN1bHQgaXMgW1hCUkwgc3BlY2lmaWNhdGlvbnNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlY2lmaWNhdGlvbnMuaHRtbCkuICANCkFzIG9mIGRhdGUgb2YgdGhpcyBkb2N1bWVudCwgdGhlIHJlbGV2YW50IGN1cnJlbnQgWEJSTCBzcGVjaWZpY2F0aW9ucyByZWNvbW1lbmRhdGlvbnMgYXJlIGFzIGZvbGxvd3M6IA0KDQoqIFtYQlJMXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtZ3JvdXAtYmFzZS1zcGVjLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBDb3JlIFhCUkwgU3BlY3MuICANCiogW0RpbWVuc2lvbnNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1ncm91cC1kaW1lbnNpb25zLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBUaGUgWEJSTCBEaW1lbnNpb25zIHNwZWNpZmljYXRpb24gZW5hYmxlcyB0aGUgcmVwb3J0aW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGZhY3RzIGFnYWluc3QgZGltZW5zaW9ucyBkZWZpbmVkIGluIGFuIFhCUkwgdGF4b25vbXkuICANCiogW0V4dGVuc2libGUgRW51bWVyYXRpb25zXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtZXh0ZW5zaWJsZS1lbnVtZXJhdGlvbnMuaHRtbCl7dGFyZ2V0PV9ibGFua306IEFsbG93cyBmb3IgY29uc3RyYWluaW5nIHRoZSBhbGxvd2VkIHZhbHVlcyBmb3IgcHJpbWFyeSByZXBvcnRpbmcgY29uY2VwdHMgKGNob2ljZXMgZnJvbSBzcGVjaWZpYyBsaXN0KS4gIA0KKiBbRm9ybXVsYV0oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjLWdyb3VwLWluZGV4LWZvcm11bGEuaHRtbCl7dGFyZ2V0PV9ibGFua306IFhCUkwgRm9ybXVsYSBwcm92aWRlcyBhIHN0YW5kYXJkIG1lY2hhbmlzbSBmb3IgZGVmaW5pbmcgcnVsZXMgaW4gYSB0YXhvbm9teSB0aGF0IGNhbiBiZSBhcHBsaWVkIGFnYWluc3QgaW5zdGFuY2UgZG9jdW1lbnRzLiAgDQoqIFtHZW5lcmljIExpbmtzXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtZ2VuZXJpYy1saW5rcy5odG1sKXt0YXJnZXQ9X2JsYW5rfTogQSBsaW5rIHR5cGUgd2l0aCBubyBwcmVkZWZpbmVkIHNlbWFudGljcyBvciBjb25zdHJhaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgZm9yIG90aGVyIHNwZWNpZmljYXRpb25zLiAgDQoqIFtHZW5lcmljIFByZWZlcnJlZCBMYWJlbF0oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjLWdyb3VwLWluZGV4LWdlbmVyaWMtcHJlZmVycmVkLWxhYmVsLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBUaGlzIHNwZWNpZmljYXRpb24gaW50cm9kdWNlcyB0aGUgcHJlZmVycmVkIGxhYmVsIGZlYXR1cmUgZm9yIGFsbCByZWxhdGlvbnNoaXBzLiAgICANCiogW0dsb2JhbCBMZWRnZXJdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC14YnJsLWdsLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBYQlJMIFNwZWNzIGZvciB0cmFuc2FjdGlvbmFsIHJlcG9ydGluZy4gIA0KKiBbSW5mcmFzdHJ1Y3R1cmVdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1pbmZyYXN0cnVjdHVyZS5odG1sKXt0YXJnZXQ9X2JsYW5rfTogU3BlY2lmaWNhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGFyZSB1c2VkIHRvIHN1cHBvcnQgdGhlIGRldmVsb3BtZW50IG9mIFhCUkwgc3BlY2lmaWNhdGlvbnMgYW5kIHJlZ2lzdHJpZXMuICANCiogW0lubGluZSBYQlJMXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtaW5saW5lLXhicmwuaHRtbCl7dGFyZ2V0PV9ibGFua306IElubGluZSBYQlJMLCBvciBpWEJSTCwgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGVtYmVkZGluZyBYQlJMIHRhZ3MgaW4gSFRNTCBkb2N1bWVudHMuICANCiogW1JlZ2lzdHJpZXNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1yZWdpc3RyaWVzLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBSZWdpc3RyaWVzIHByb3ZpZGUgYSBjZW50cmFsaXNlIGxpc3Qgb2YgZGVmaW5pdGlvbnMsIGFsbG93aW5nIGltcGxlbWVudGVycyB0byByZS11c2Ugc3VpdGFibGUgZGVmaW5pdGlvbnMgY3JlYXRlZCBieSBvdGhlcnMuICANCiogW1RhYmxlIExpbmtiYXNlXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtdGFibGUtbGlua2Jhc2UuaHRtbCl7dGFyZ2V0PV9ibGFua306IFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB0YXhvbm9teSBhdXRob3JzIHRvIGRlZmluZSBhIHRhYnVsYXIgbGF5b3V0IG9mIGZhY3RzLiBUaGUgcmVzdWx0aW5nIHRhYmxlcyBjYW4gYmUgdXNlZCBmb3IgYm90aCBwcmVzZW50YXRpb24gYW5kIGRhdGEgZW50cnkuICANCiogW1RheG9ub215ICYgUmVwb3J0IFBhY2thZ2VzXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtdGF4b25vbXktcGFja2FnZXMuaHRtbCl7dGFyZ2V0PV9ibGFua306IFRheG9ub215IFBhY2thZ2VzIHByb3ZpZGUgYSBzdGFuZGFyZGlzZWQgbWVjaGFuaXNtIGZvciBwcm92aWRpbmcgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgY29udGVudCBvZiBhIHRheG9ub215LiAgDQoqIFtWZXJzaW9uaW5nXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtZ3JvdXAtdmVyc2lvbmluZy5odG1sKXt0YXJnZXQ9X2JsYW5rfTogRGVmaW5lcyBhbiBYTUwgc3ludGF4IGZvciBhbiBYQlJMIHZlcnNpb25pbmcgUmVwb3J0LiAgDQoNCkxpbmsgZm9yIGVhY2ggcmVjb21tZW5kYXRpb24gaW5jbHVkZXMgdGhlIG5vcm1hdGl2ZSBzY2hlbWEuIA0KDQojIyMgWEJSTCBSZXByZXNlbnRhdGlvbiBvZiBEYXRhICANCkluIHRoZSBpbnRyb2R1Y3Rpb24gb2YgVERILCBpdCBzdGF0ZXMgdGhhdCAgWEJSTCBwcm92aWRlcyBhIHBsYXRmb3JtIHRvIGdpdmUgZGF0YSBtZWFuaW5nIFtbVERIIHNlY3Rpb24gMS4xLjMgcGFnZSAyXShodHRwczovL3hicmx1cy5naXRodWIuaW8vZG9jcy90ZGguaHRtbCNhX1RvYzQ1Nzk0ODkwKV0uIEEgcGllY2Ugb2YgZGF0YSByZWFsbHkgZG9lcyBub3QgaGF2ZSBhIG1lYW5pbmcgd2l0aG91dCBhIGNvbnRleHQgb3IgbWVhbnMgdG8gYXNzb2NpYXRlIGl0IHdpdGggb3RoZXIgZGF0YSBwb2ludHMsIGZvciBleGFtcGxlLCBkYXRhIGFib3V0IGEgc3dpdGNoIGJlaW5nIG9uIG9yIG9mZiBkb2Vzbid0IGhhdmUgbXVjaCB2YWx1ZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgZG9lcyB0aGlzIHN3aXRjaCBkbyBhbmQgd2hlbiB3YXMgaXQgb24gb3Igb2ZmLiBYQlJMIGdpdmVzIG1lYW5pbmcgdG8gZGF0YSBieSBwcm92aWRpbmcgbGF5ZXJzIG9mIGNvbnRleHQuDQoNCiMjIyMgX1NvbWUgQmFzaWNzXyAgDQpUaGUgVERIIHByZXNlbnRzIHRoZSBhbiBleGFtcGxlIG9mIGEgX21vbnRobHkgZXhwZW5zZXMgcmVwb3J0IFtUREggc2VjdGlvbiAyLjIgcGFnZSAxNV0oaHR0cHM6Ly94YnJsdXMuZ2l0aHViLmlvL2RvY3MvdGRoLmh0bWwjYV9Ub2M0NTc5NDg5NClfIG9mIGEgcGVyc29uIG5hbWVkICJCb2IiLCB0aGUgcmVwb3J0IGlzIGluIHRoZSBmb3JtIG9mIGEgdGFibGUgd2l0aCBpdHMgcm93cyBoYXZpbmcgZXhwZW5zZXMgbGluZSBpdGVtcywgYW5kIGNvbHVtbnMgaGF2aW5nIG1vbnRocyBhbmQgYW1vdW50cyBvZiBleHBlbnNlcy4gIA0KDQpUaGUgVERIIGV4cGxhaW5zIHRoYXQgZXhwZW5zZXMgYW1vdW50cyBhbG9uZSBkbyBub3QgY29udmV5IG11Y2ggbWVhbmluZyB1bmxlc3MgYXNzb2NpYXRlZCB3aXRoIF9kaW1lbnNpb25zXyBpZGVudGlmeWluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbW91bnRzLCBmb3IgZXhhbXBsZSwgd2hvIG1hZGUgdGhlIGV4cGVuc2VzLCB3aGF0IGlzIHRoZSBuYXR1cmUgb2YgdGhlIGV4cGVuc2UsIGFuZCBpbiB3aGljaCBwZXJpb2RzIGV4cGVuc2VzIHdlcmUgbWFkZS4gVGhlIGludGVyc2VjdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGVzZSBkaW1lbnNpb25zIHdpdGggYW4gYW1vdW50IGNyZWF0ZXMgYSBfZmFjdF8gdGhhdCBoYXMgY29udGV4dHVhbCBtZWFuaW5nLiAgDQoNCk9uZSBvZiB0aGUgYmFzaWMgY29uY2VwdHMgb2YgWEJSTCBkZXNpZ24gaXMgdGhhdCBpdCBpZGVudGlmaWVzIGRhdGEgcG9pbnRzIGJ5IG11bHRpcGxlIGRpbWVuc2lvbnMgdGhhdCBnaXZlcyBlbm91Z2ggY29udGV4dCB0byB0aGUgZGF0YSBwb2ludCB0byBiZSBtZWFuaW5nZnVsLCBsaWtlIGluIHRoZSBjYXNlIG9mIHRoZSBleHBlbnNlIHJlcG9ydCAoVERIIGV4YW1wbGUpLCBhbiBhbW91bnQgb2YgYCQ5MDBgIGluIHRoZSBmaXJzdCByb3csIGlzIGlkZW50aWZpZWQgYnkgZGltZW5zaW9ucyBgRm9vZGAgYXMgbmF0dXJlIG9mIGV4cGVuc2UsIGFuZCBgSmFudWFyeWAgYXMgZXhwZW5zZSBwZXJpb2QsIGFuZCBgQm9iYCBhcyB0aGUgcGVyc29uIHdobyBtYWRlIHRoZSBleHBlbnNlLCB3aGljaCBjcmVhdGVzIGFuIFhCUkwgYEZhY3RgLiAgDQoNClRoZSBUREggY2xhc3NpZmllcyBkaW1lbnNpb25zIHRoYXQgaWRlbnRpZmllcyBmYWN0cyBpbiBYQlJMIGludG8gMiBjYXRlZ29yaWVzOiAgDQoNCjEuIGBDb3JlIERpbWVuc2lvbnNgIHdoaWNoIGluY2x1ZGVzOiAgDQogICAgKyAqKl9Db25jZXB0XyoqIGNvcmUgZGltZW5zaW9uOiBBIHRheG9ub215IGVsZW1lbnQgKGRpY3Rpb25hcnkvdm9jYWJ1bGFyeSkgdGhhdCBwcm92aWRlcyB0aGUgbWVhbmluZyBmb3IgYSBmYWN0IChlLmcuIEZpeGVkIEFzc2V0cywgUmV2ZW51ZSwgUHJvZml0IC4uLiksIGNvbmNlcHRzIGFyZSB0aGUgYnVpbGRpbmcgYmxvY2tzIG9mIGEgdGF4b25vbXkuICANCiAgICArICoqX1BlcmlvZF8qKiBjb3JlIGRpbWVuc2lvbjogVGltZSBmcmFtZSBvciBwb2ludCBvZiB0aW1lIHJlbGV2YW50IHRvIHRoZSBmYWN0LiAgDQogICAgKyAqKl9SZXBvcnRpbmcgZW50aXR5XyoqICBjb3JlIGRpbWVuc2lvbjogVGhlIGVudGl0eSByZXBvcnRpbmcgdGhlIGZhY3QsIGFsc28ga25vd24gYXMgYGlkZW50aWZpZXJgICANCiAgICArICoqX1VuaXRfKiogY29yZSBkaW1lbnNpb246IFVuaXQgb2YgbWVhc3VyZW1lbnQgb2YgcmVwb3J0ZWQgZmFjdCAoZS5nLiBVU0QsIEVVUk8sIEtNLCBLR00sIFVTRC9TaGFyZS4uLiksIGl0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIG51bWVyaWMgZmFjdHMuIA0KDQoyLiBgVGF4b25vbXkgRGVmaW5lZCBEaW1lbnNpb25zYDogQ29uY2VwdHMgdGhhdCBleGlzdCBmb3IgdGhlIHB1cnBvc2Ugb2YgZ3JvdXBpbmcgZmFjdHMgdGhhdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgaW4gYSBzaW1pbGFyIHdheS4gVGF4b25vbXkgRGVmaW5lZCBEaW1lbnNpb25zIGRvIG5vdCBkaXJlY3RseSBkZWZpbmUgYSBmYWN0IGJ1dCByYXRoZXIgaW50ZXJzZWN0IHdpdGggYSBmYWN0IHRvIGFkZCBmdXJ0aGVyIGNvbnRleHR1YWwgb3Igc2VtYW50aWMgaW5mb3JtYXRpb24gYmV5b25kIHdoYXQgaXMgYWRkZWQgYnkgdGhlIGNvcmUgZGltZW5zaW9ucywgZm9yIGV4YW1wbGUgYSBjb3VudHJ5IGRpbWVuc2lvbiBmb3IgZ2VvZ3JhcGhpY2FsIGFsbG9jYXRpb24uDQoNClRoZSBDb3JlIERpbWVuc2lvbiBhbmQgVGF4b25vbXkgRGVmaW5lZCBEaW1lbnNpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBYQlJMIFRheG9ub215IG9yIGl0cyBleHRlbnNpb25zIHVzaW5nIFhCUkwgY29tcG9uZW50cywgYW5kIHRoZW4gdXNlZCBpbiBhbiBYQlJMIGluc3RhbmNlIHRvIHJlcG9ydCBmYWN0cy4gIA0KDQojIyMjIF9YQlJMIEVsZW1lbnRzIFVzYWdlXyAgDQpYQlJMIHNwZWNpZmljYXRpb25zIGRlZmluZSBob3cgd2UgY2FuIGV4cHJlc3MgYSBmaW5hbmNpYWwgcmVwb3J0LCBuZXh0IHdlIHdpbGwgbG9vayBhdCB0aGUgWEJSTCBlbGVtZW50cyB1c2VkIHRvIGRlc2NyaWJlIGEgZGF0YSBwb2ludC4gIA0KDQpBc3N1bWluZyB3ZSB3YW50IHRvIGNyZWF0ZSBhbiBYQlJMIHJlcG9ydCBmb3JtIHRoZSBtb250aGx5IGV4cGVuc2VzIGV4YW1wbGUsIGZpcnN0IHdlIG5lZWQgdG8gdXNlIFhCUkwgc3BlY2lmaWNhdGlvbnMgdG8gY3JlYXRlIGEgdGF4b25vbXkgY29udGFpbmluZyB0aGUgdm9jYWJ1bGFyeSBhbmQgbGlua2Jhc2VzLCB0aGVuIHdlIGNhbiBjcmVhdGUgYW4gWEJSTCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBmYWN0cywgbGV0J3MgdHJ5IHRvIGNyZWF0ZSBmZXcgZWxlbWVudHMgYW5kIGRpc2NvdmVyIHRoZSBiYXNpYyB1c2FnZSBvZiBYQlJMIGVsZW1lbnRzLiAgDQoNCiMjIyMgX0NyZWF0aW5nIFhCUkwgVGF4b25vbXkgYENvbmNlcHRgXyAgDQpDb25jZXB0cyBpbiBhbiBYQlJMIHRheG9ub215IGFyZSBlbGVtZW50cyB0aGF0IHByb3ZpZGVzIGEgbWVhbmluZyBmb3IgYSBmYWN0LCBpdCBpcyBkZWZpbmVkIGluIHRoZSBYQlJMIFRheG9ub215IHNjaGVtYS4gQ29uY2VwdHMgbWFrZSB1cCB0aGUgZGljdGlvbmFyeS92b2NhYnVsYXJ5IGFsbG93ZWQgdG8gYmUgdXNlZCBieSB0aGUgVGF4b25vbXkuIA0KDQpJbiBjYXNlIG9mIGEgZmluYW5jaWFsIHJlcG9ydGluZyB0YXhvbm9teSwgY29uY2VwdHMgbWF5IGRlc2NyaWJlIG51bWVyaWMgZmluYW5jaWFsIGVsZW1lbnRzIHN1Y2ggYXMgYE5ldCBQcm9maXRgLCBgQXNzZXRzYCBvciBgTGlhYmlsaXRpZXNgLCBvciBuYXJyYXRpdmUgZWxlbWVudHMsIGxpa2UgYEFjY291bnRpbmcgUG9saWNpZXNgLiBJbiBzaG9ydCwgYSBjb25jZXB0IG5lZWRzIHRvIGJlIGNyZWF0ZWQgZm9yIGV2ZXJ5IHJlcG9ydGFibGUgZWxlbWVudCB3aXRoaW4gdGhlIGRvbWFpbiBvZiB0aGUgdGF4b25vbXksIGNvbmNlcHRzIGFyZSB0aGUgYmFja2JvbmUgb2YgdGhlIFRheG9ub215LiBCdWlsZGluZyBibG9ja3MgZm9yIGEgdGF4b25vbXkgY29uY2VwdCBhcmUgZGVmaW5lZCBpbiBYQlJMIGNvcmUgc3BlY2lmaWNhdGlvbnMgaW4gbmFtZXNwYWNlIGB7aHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlfWAuIENvbmNlcHRzIGhhdmUgMiBtYWluIHR5cGVzIGRlZmluZWQgaW4gWEJSTCB0YXhvbm9teSwgYGl0ZW1gIGFuZCBgdHVwbGVgOiAgDQoNCiogYGl0ZW1gOiBhbiBJdGVtIHJlcHJlc2VudHMgYSBzaW5nbGUgZmFjdCBvciBidXNpbmVzcyBtZWFzdXJlbWVudC4gSW4gdGhlIFhNTCBTY2hlbWEgZm9yIFhCUkwgaW5zdGFuY2VzLCBpdGVtIGlzIGRlZmluZWQgYXMgYW4gQWJzdHJhY3QgRWxlbWVudC4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgbmV2ZXIgYXBwZWFyIGluIGl0cyBvd24gcmlnaHQgaW4gYW4gWEJSTCBJbnN0YW5jZS4gVGhlcmVmb3JlLCBhbGwgZWxlbWVudHMgcmVwcmVzZW50aW5nIHNpbmdsZSBmYWN0cyBvciBidXNpbmVzcyBtZWFzdXJlbWVudHMgZGVmaW5lZCBpbiBhbiBYQlJMIHRheG9ub215IGRvY3VtZW50IGFuZCByZXBvcnRlZCBpbiBhbiBYQlJMIGluc3RhbmNlIE1VU1QgYmUgZWl0aGVyIChhKSBtZW1iZXJzIG9mIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgaXRlbTsgb3IsIChiKSBtZW1iZXJzIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwIG9yaWdpbmFsbHkgYmFzZWQgb24gaXRlbS4gDQoNCl8qKk5vdGUqKiBgc3Vic3RpdHV0aW9uR3JvdXBgOiBBIHN1YnN0aXR1dGlvbiBncm91cCBpcyBhIGZlYXR1cmUgb2YgWE1MIHNjaGVtYSB0aGF0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBlbGVtZW50cyB0aGF0IGNhbiByZXBsYWNlIGFub3RoZXIgZWxlbWVudCBpbiBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gdGhhdCBzY2hlbWEuIFRoZSByZXBsYWNlYWJsZSBlbGVtZW50IGlzIGNhbGxlZCB0aGUgaGVhZCBlbGVtZW50IGFuZCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNjaGVtYeKAmXMgZ2xvYmFsIHNjb3BlLiBUaGUgZWxlbWVudHMgb2YgdGhlIHN1YnN0aXR1dGlvbiBncm91cCBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGhlYWQgZWxlbWVudCBvciBhIHR5cGUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIGhlYWQgZWxlbWVudOKAmXMgdHlwZS5fDQoNCiogYHR1cGxlYDogV2hpbGUgbW9zdCBidXNpbmVzcyBmYWN0cyBjYW4gYmUgaW5kZXBlbmRlbnRseSB1bmRlcnN0b29kLCBzb21lIGZhY3RzIGFyZSBkZXBlbmRlbnQgb24gZWFjaCBvdGhlciBmb3IgcHJvcGVyIHVuZGVyc3RhbmRpbmcsIGVzcGVjaWFsbHkgaWYgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhhdCBmYWN0IGFyZSBiZWluZyByZXBvcnRlZC4gRm9yIGV4YW1wbGUsIGluIHJlcG9ydGluZyB0aGUgbWFuYWdlbWVudCBvZiBhIGNvbXBhbnksIGVhY2ggbWFuYWdlcidzIG5hbWUgaGFzIHRvIGJlIHByb3Blcmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFuYWdlcidzIGNvcnJlY3QgdGl0bGUuIFN1Y2ggc2V0cyBvZiBmYWN0cyAobWFuYWdlcidzIHRpdGxlL21hbmFnZXIncyBuYW1lKSBhcmUgY2FsbGVkIHR1cGxlcy4NCg0KVHVwbGVzIGhhdmUgY29tcGxleCBjb250ZW50IGFuZCBNQVkgY29udGFpbiBib3RoIGl0ZW1zIGFuZCBvdGhlciB0dXBsZXMuIExpa2UgdGhlIGA8aXRlbT5gIGVsZW1lbnQsIHRoZSBgPHR1cGxlPmAgZWxlbWVudCBpcyBhYnN0cmFjdC4gIA0KDQoqKl9YQlJMIERhdGEgVHlwZXNfKiogIA0KQXMgbWVudGlvbmVkIGFib3ZlLCB3aGVuIGRlZmluaW5nIGFuIFhCUkwgQ29uY2VwdCBpbiB0aGUgdGF4b25vbXksIGl0IHdpbGwgYmUgaW4gZWl0aGVyIGBpdGVtYCBvciBgdHVwbGVgIHN1YnN0aXR1dGlvbiBncm91cHMsIGEgZGF0YSB0eXBlIG11c3QgYmUgZ2l2ZW4gdG8gdGhlIGNvbmNlcHQgdGhlIGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGRhdGEgY2FuIGJlIHN0b3JlZCBpbiB0aGlzIGVsZW1lbnQgKGZvciBleGFtcGxlLCBudW1iZXJzLCBkYXRlcywgc3RyaW5ncywgLi4uIGV0YyksIFhCUkwgdXNlcyBYTUwgc3RhbmRhcmQgdHlwZXMgaW4gYWRkaXRpb24gdG8gb3RoZXIgZGVyaXZlZCB0eXBlcywgKipUREggdGFibGUgMi0zIHBhZ2UgMjgqKiBzaG93cyB0aGUgbW9zdCBjb21tb24gdHlwZXMgdXNlZCBpbiBYQlJMOiAgDQpgYGB7ciB0ZGhfZGF0YV90eXBlcywgZWNobz1GQUxTRX0NCmxpc3QoDQogICAgICAgICAgICAgIGMoYGRhdGFUeXBlYD0nc3RyaW5nSXRlbVR5cGUnLCBkZXNjcmlwdGlvbj0nUmVwcmVzZW50cyBjaGFyYWN0ZXIgc3RyaW5ncyBpbiBYTUwuJyksDQogICAgICAgICAgICAgIGMoYGRhdGFUeXBlYD0nYm9vbGVhbkl0ZW1UeXBlJywgZGVzY3JpcHRpb249J1JlcHJlc2VudHMgdGhlIHZhbHVlcyBvZiB0d28tdmFsdWVkIGxvZ2ljICh0cnVlLCBmYWxzZSkuJyksDQogICAgICAgICAgICAgIGMoYGRhdGFUeXBlYD0nZGVjaW1hbEl0ZW1UeXBlJywgZGVzY3JpcHRpb249J1JlcHJlc2VudHMgYSBzdWJzZXQgb2YgcmVhbCBudW1iZXJzLCB3aGljaCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgZGVjaW1hbCBudW1lcmFscy4nKSwNCiAgICAgICAgICAgICAgYyhgZGF0YVR5cGVgPSdkYXRlVGltZUl0ZW1UeXBlJywgZGVzY3JpcHRpb249J1JlcHJlc2VudHMgaW5zdGFudHMgb2YgdGltZSwgb3B0aW9uYWxseSBtYXJrZWQgd2l0aCBhIHRpbWUgem9uZSBvZmZzZXQuJyksDQogICAgICAgICAgICAgIGMoYGRhdGFUeXBlYD0naW50ZWdlckl0ZW1UeXBlJywgZGVzY3JpcHRpb249J1JlcHJlc2VudHMgdGhlIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBjb25jZXB0IG9mIGludGVnZXIgbnVtYmVycyBieSBmaXhpbmcgdGhlIGZyYWN0aW9uYWwgZGlnaXRzIG9mIGRlY2ltYWwgdG8gYmUgMCBhbmQgcHJvaGliaXRpbmcgdGhlIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnQuJyksDQogICAgICAgICAgICAgIGMoYGRhdGFUeXBlYD0nbW9uZXRhcnlJdGVtVHlwZScsIGRlc2NyaXB0aW9uPSdSZXByZXNlbnRzIGEgZGVjaW1hbCB3aXRoIHRoZSBhZGRlZCBjb25zdHJhaW50IG9mIGEgY3VycmVuY3kgdW5pdC4nKSwNCiAgICAgICAgICAgICAgYyhgZGF0YVR5cGVgPSdxTmFtZUl0ZW1UeXBlJywgZGVzY3JpcHRpb249J1JlcHJlc2VudHMgYSBxdWFsaWZpZWQgWE1MIG5hbWUuJykNCikgJT4lIGJpbmRfcm93cygpICU+JSANCiAga25pdHI6OmthYmxlKCdodG1sJykgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpICU+JSANCiAgaHRtbHRvb2xzOjpIVE1MKCkgJT4lIA0KICBodG1sdG9vbHM6OmRpdihzdHlsZT0ib3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOiBub3dyYXA7IikNCmBgYA0KDQpBYm92ZSBhcmUganVzdCBhIHNhbXBsZSBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGRhdGEgdHlwZXMsIFtYQlJMIFNwZWNpZmljYXRpb25zIFtTZWN0aW9uIDUuMS4xLjNdXShodHRwczovL3d3dy54YnJsLm9yZy9TcGVjaWZpY2F0aW9uL1hCUkwtMi4xL1JFQy0yMDAzLTEyLTMxL1hCUkwtMi4xLVJFQy0yMDAzLTEyLTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxMy0wMi0yMC5odG1sI181LjEuMS4zKSBsaXN0cyBtb3JlIGRhdGEgdHlwZXMsIGFsc28gb3RoZXIgWEJSTCBkYXRhIHR5cGVzIGFyZSBkZWZpbmVkIGluIFtYQlJMIERhdGEgVHlwZXMgUmVnaXN0cnldKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvd29yay1wcm9kdWN0LWluZGV4LXJlZ2lzdHJpZXMtZHRyLTEuMC5odG1sKS4NCg0KTGV0J3MgZGVmaW5lIGBGb29kYCBjb25jZXB0IChmcm9tIHRoZSBtb250aGx5IGV4cGVuc2VzIHJlcG9ydCksIHdpdGggdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6ICANCg0KKiBIYXMgYSBgZGViaXRgIGJhbGFuY2UsICANCiogSXRzIHZhbHVlIENhbm5vdCBiZSBudWxsIChhYnNlbnQgdmFsdWUpLCBpdCBjYW4gaGF2ZSBhIHZhbHVlIG9mIGAwYCB0aG91Z2gsICANCiogSXQgaXMgYSBtb25ldGFyeSBpdGVtLCBtZWFuaW5nIHRoYXQgaXQgbmVlZHMgdG8gaGF2ZSBhIG51bWVyaWMgdmFsdWUgYW5kIGEgdW5pdA0KDQpDb25jZXB0IGlzIGRlZmluZWQgaW4gdGhlIHRheG9ub215IFNDSEVNQSBhcyBmb2xsb3dzOiAgDQo8ZGl2IGlkPSJleGFtcGxlXzFfc2NoZW1hXzAxIi8+DQpgYGB7ciBleGFtcGxlXzFfc2NoZW1hXzAxLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmcgPSAneG1sJywgdHh0ID0gDQonPCEtLSBGcm9tIHRheG9ub215IHNjaGVtYSBmaWxlICgueHNkKSAtLT4NCjx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KICB4bWxuczpleGFtcGxlPSJodHRwOi8vd3d3LmV4cGVuc2VzLmNvbS90YXhvbm9teSINCiAgeG1sbnM6eGJybGk9Imh0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9pbnN0YW5jZSINCiAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4cGVuc2VzLmNvbS90YXhvbm9teSI+DQogICAgDQogICAgPGVsZW1lbnQgDQogICAgICB4YnJsaTpuYW1lPSJGb29kIg0KICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iDQogICAgICB4YnJsaTpiYWxhbmNlPSJkZWJpdCINCiAgICAgIG5pbGxhYmxlPSJmYWxzZSINCiAgICAgIGFic3RyYWN0PSJmYWxzZSINCiAgICAgIHR5cGU9InhicmxpOm1vbmV0YXJ5SXRlbVR5cGUiDQogICAgICBzdWJzdGl0dXN0aW9uR3JvdXA9InhicmxpOml0ZW0iDQogICAgICBpZD0iZXhwZW5zZV9Gb29kIi8+DQogICAgICAgIA0KPC94czpzY2hlbWE+JykNCmBgYA0KX05vdGVzOl8gIA0KDQoqIE5hbWVzcGFjZSBgaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlYCBwcmVmaXhlZCBhcyBgeGJybGlgIHdhcyBkZWNsYXJlZCBmb3IgWEJSTCBzcGVjaWZpY2F0aW9uIHNjaGVtYSB0byBiZSBhYmxlIHRvIHVzZSBlbGVtZW50cyBmb3JtIHRoYXQgbmFtZXNwYWNlLiANCiogV2UgZ2F2ZSBvdXIgdGF4b25vbXkgdGhlIG5hbWVzcGFjZSBgaHR0cDovL3d3dy5leHBlbnNlcy5jb20vdGF4b25vbXlgIHByZWZpeGVkIGFzIGBleHBlbnNlc2ANCiogYGR1cmF0aW9uYCB3YXMgc2VsZWN0ZWQgZm9yIGBAeGJybGk6cGVyaW9kVHlwZWAgWEJSTCBhdHRyaWJ1dGUsIGJlY2F1c2UgdGhpcyBpcyBhbiBleHBlbnNlIHRoYXQgb2NjdXJzIGR1cmluZyBhIHNwZWNpZmllZCBwZXJpb2QgKG5vdCBhIGJhbGFuY2UgYXQgYSBtb21lbnQgb2YgdGltZSkuICANCiogYHhicmxpOm1vbmV0YXJ5SXRlbVR5cGVgIHdhcyBhc3NpZ25lZCB0byBgQHR5cGVgIHRvIHJlZmxlY3QgdGhlIHR5cGUgb2YgZGF0YSBleHBlY3RlZCB0byBiZSByZXBvcnRlZCBmb3IgdGhpcyBjb25jZXB0LiAgDQoqIEVhY2ggZWxlbWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgaWQuICANCiogQmVjYXVzZSB3ZSByZWZlcmVlZCB0byBYQlJMIHNwZWNpZmljYXRpb24sIHRoaXMgc2NoZW1hIGRvY3VtZW50IGNhbiBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBYQlJMIHNwZWNpZmljYXRpb25zLg0KDQojIyMjIF9YQlJMIEluc3RhbmNlIERvY3VtZW50X3sjaW5zLWRvY30gIA0KSW5zdGFuY2UgZG9jdW1lbnQgaXMgdGhlIGFjdHVhbCByZXBvcnQgY29udGFpbmluZyB0aGUgZmFjdHMgYW5kIGluZm9ybWF0aW9uIGZvciB0aGUgcmVwb3J0LCBpdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBYQlJMIGNvbnN0cnVjdHMuIFRoZSByb290IGVsZW1lbnQgb2YgWEJSTCBpbnN0YW5jZSBkb2N1bWVudCBpcyBgPHhicmw+YCwgYW5kIGl0IGlzIGRlZmluZWQgaW4gWEJSTCBzcGVjaWZpY2F0aW9uIGluIHRoZSBuYW1lc3BhY2UgYHtodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvaW5zdGFuY2V9YCwgYSBkaWFncmFtIGZvciB0aGUgYHhicmxgIGVsZW1lbnQgZGVjbGFyYXRpb25zIGlzIGFzIGZvbGxvd3M6ICANCg0KPGRpdj4NCjxjZW50ZXI+DQohW1hCUkwgVHlwZV0oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMveGJybEVsZW1lbnQuanBnJylgKQ0KPC9jZW50ZXI+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KKipYQlJMIFR5cGUgRGVjbGFyYXRpb24qKg0KPC9wPg0KPC9kaXY+DQoNClRoZSBYQlJMIGFsbG93ZWQgY2hpbGQgZWxlbWVudHMgYXJlIGFzIGZvbGxvd3M6ICANCioqQS4gTGlua3MgdG8gc2NoZW1hIGFuZCBkZWNsYXJhdGlvbiB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVwb3J0OioqICANCg0KKiBgPFNjaGVtYVJlZj5gOiBBbiBYTUwgc2ltcGxlIHR5cGUgbGluayB0byBsb2NhdGlvbiBvZiB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIHRheG9ub215IHJlbGV2YW50IHRvIHRoaXMgcmVwb3J0LiBUaGlzIGVsZW1lbnQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgYHtodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvbGlua2Jhc2V9YC4gIA0KKiBgPGxpbmtiYXNlUmVmPmA6IEFuIFhNTCBzaW1wbGUgdHlwZSBsaW5rIHRvIGxvY2F0aW9uIG9mIGxpbmtiYXNlIHJlbGV2YW50IHRvIHRoaXMgcmVwb3J0LiB0aGlzIGVsZW1lbnQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgYHtodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvbGlua2Jhc2V9YCAoU2VlIHNlY3Rpb24gMy43LjQgTGlua2Jhc2VzKS4gDQoqIGA8cm9sZVJlZj5gOiBBbiBYTUwgc2ltcGxlIHR5cGUgbGluayB0byBsb2NhdGlvbiBvZiBkZWNsYXJhdGlvbiBvZiBhIHJvbGVUeXBlIHVzZWQgaW4gdGhpcyByZXBvcnQuIEVsZW1lbnQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgYHtodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvbGlua2Jhc2V9YA0KKiBgPGFyY3JvbGVSZWY+YDogQW4gWE1MIHNpbXBsZSB0eXBlIGxpbmsgdG8gbG9jYXRpb24gb2YgZGVjbGFyYXRpb24gb2YgYSBhcmNyb2xlVHlwZSB1c2VkIGluIHRoaXMgcmVwb3J0LiBFbGVtZW50IGlzIGRlZmluZWQgaW4gbmFtZXNwYWNlIGB7aHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2xpbmtiYXNlfWANCg0KKipCLiBFbGVtZW50cyB1c2VkIHRvIGNhcnJ5IHRoZSBpbmZvcm1hdGlvbiBvZiBjdXJyZW50IHJlcG9ydDoqKiAgDQoNCiMjIyMjIF9DcmVhdGluZyBYQlJMIGluc3RhbmNlIGBDb250ZXh0YF8gIA0KQXNzdW1pbmcgd2Ugd2FudCB0byByZXBvcnQgdGhhdCBgQm9iYCdzIGBGb29kYCBleHBlbnNlcyBmb3IgSmFudWFyeSAyMDIwIHdhcyAkOTAwLCBub3RlIGhlcmUgdGhhdCB3ZSBhdHRhY2hlZCAzIHBpZWNlcyBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBleHBlbnNlIGFtb3VudCwgYEZvb2RgIHRoZSBjb25jZXB0IGNvcmUgZGltZW5zaW9uLCBgQm9iYCB0aGUgb3duZXIgb2YgdGhlIGV4cGVuc2UgYW5kIGBKYW51YXJ5IDIwMjBgIHRoZSBwZXJpb2QgY29yZSBkaW1lbnNpb24uIHdlIGFscmVhZHkgZGVmaW5lZCB0aGUgYEZvb2RgIGNvbmNlcHQgYWJvdmUsIHRvIGF0dGFjaCB0aGUgb3duZXIgb2YgdGhlIGV4cGVuc2VzIGFuZCB0aGUgcGVyaW9kIHdlIG5lZWQgdG8gdXNlIFhCUkwgYGNvbnRleHRgIGVsZW1lbnQuICANCg0KYGNvbnRleHRgIGlzIGFuIFhCUkwgZWxlbWVudCB1c2VkIGluIFhCUkwgaW5zdGFuY2UgZG9jdW1lbnQgKHJlcG9ydCkgYW5kIHJlZmVyZW5jZWQgYnkgb25lIG9yIG1vcmUgZmFjdChzKSBpbiB0aGUgWEJSTCByZXBvcnQuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHBlcmlvZCwgZW50aXR5LCBhbmQgb3RoZXIgdGF4b25vbXkgZGVmaW5lZCBkaW1lbnNpb24gcmVsYXRpbmcgdG8gdGhpcyBjb250ZXh0LCBmb2xsb3dpbmcgaXMgYSBkaWFncmFtIG9mIGNvbnRleHQgdHlwZSBkZWNsYXJhdGlvbjogIA0KDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbQ29udGV4dCBUeXBlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9jb250ZXh0RWxlbWVudC5qcGcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKkNvbnRleHQgVHlwZSBEZWNsYXJhdGlvbioqDQo8L3A+DQo8L2Rpdj4NCg0KDQpXZSBjYW4gZGVmaW5lIGEgY29udGV4dCBmb3IgYEJvYmAgb3duZXIsIGFuZCBKYW51YXJ5IDIwMjAgcGVyaW9kIGFzIGZvbGxvd3M6ICANCmBgYHtyIGV4YW1wbGVfMV9pbnN0YW5jZV8wMSwgZWNobz1GQUxTRX0NCmZuX0NvZGVDaHVua091dChsYW5nID0gJ3htbCcsIHR4dCA9IA0KJzwhLS0gZGVmaW5lZCBpbiBpbnN0YW5jZSBkb2N1bWVudCAtLT4NCjx4YnJsIHhtbG5zPSJodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvaW5zdGFuY2UiDQogICAgICB4bWxuczpleHBlbnNlcz0iaHR0cDovL3d3dy5leHBlbnNlcy5jb20vdGF4b25vbXkiDQogICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWw6bGFuZz0iZW4tVVMiPg0KICAgIDwhLS0gLi4uIGF0IGxlYXN0IG9uZSBsaW5rOnNjaGVtYVJlZiBlbGVtZW50IGdvZXMgaGVyZSAuLi4gLS0+DQogICAgPGNvbnRleHQgaWQ9IjAxIj4NCiAgICAgIDxlbnRpdHk+DQogICAgICAgIDxpZGVudGlmaWVyIHNjaGVtZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ib2IiPkJvYjwvaWRlbnRpZmllcj4NCiAgICAgIDwvZW50aXR5Pg0KICAgICAgPHBlcmlvZD4NCiAgICAgICAgPHN0YXJ0RGF0ZT4yMDIwLTAxLTAxPC9zdGFydERhdGU+DQogICAgICAgIDxlbmREYXRlPjIwMjAtMDEtMzE8L2VuZERhdGU+DQogICAgICA8L3BlcmlvZD4NCiAgICA8L2NvbnRleHQ+DQo8L3hicmw+ICcpDQpgYGANCl9Ob3RlcyBYQlJMIGluc3RhbmNlIGRvY3VtZW50XyAgDQoNCiogWEJSTCBpbnN0YW5jZSBkb2N1bWVudCByb290IGVsZW1lbnQgbXVzdCBiZSBlbGVtZW50IGA8eGJybD5gICANCiogV2UgcmVmZXJlbmNlZCBvdXIgdGF4b25vbXkgbmFtZXNwYWNlIHRvIGJlIGFibGUgdG8gdXNlIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhhdCB0YXhvbm9teS4gIA0KKiBXZSByZWZlcmVuY2VkIFhCUkwgc2NoZW1hICh3aXRoIG5vIHByZWZpeCkgdG8gYmUgYWJsZSB0byB1c2UgWEJSTC4gIA0KKiBCZWNhdXNlIG9mIHRoZSByZWZlcmVuY2VzIGFib3ZlLCB0aGlzIFhCUkwgaW5zdGFuY2UgZG9jdW1lbnQgY2FuIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IFhCUkwgc3BlY2lmaWNhdGlvbnMgYW5kIG91ciB0YXhvbm9teS4gIA0KDQojIyMjIyBfQ3JlYXRpbmcgWEJSTCBpbnN0YW5jZSBgdW5pdGBfICANClhCUkwgcmVxdWlyZXMgdGhhdCBudW1lcmljIHR5cGUgZmFjdHMgaGFzIGEgcmVmZXJlbmNlIHRvIGEgdW5pdCBbW3NlZSBYQlJMIHNwZWNzIDQuNi4yXShodHRwczovL3d3dy54YnJsLm9yZy9TcGVjaWZpY2F0aW9uL1hCUkwtMi4xL1JFQy0yMDAzLTEyLTMxL1hCUkwtMi4xLVJFQy0yMDAzLTEyLTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxMy0wMi0yMC5odG1sI180LjYuMildLiBBbmQgc2luY2Ugb3VyIGNvbmNlcHQgaXMgYSBtb25ldGFyeSB0eXBlIHdoaWNoIGlzIG51bWVyaWMgdHlwZSwgdGhlbiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHVuaXQgaW4gb3VyIGluc3RhbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgY29udGV4dCBiZWZvcmUgd2UgYXJlIGFibGUgdG8gY3JlYXRlIGEgZmFjdC4gDQpGb2xsb3dpbmcgaXMgYSBkaWFncmFtIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHVuaXQgdHlwZSBpbiBYQlJMIHNwZWNpZmljYXRpb25zOiAgDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbVW5pdCBUeXBlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy91bml0RWxlbWVudC5qcGcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKlVuaXQgVHlwZSBEZWNsYXJhdGlvbioqDQo8L3A+DQo8L2Rpdj4NCg0KV2UgZGVjbGFyZSBhIHVuaXQgZm9yIFVuaXRlZCBTdGF0ZXMgRG9sbGFycyB1c2luZyBgaXNvNDIxN2AgdGF4b25vbXkgYFVTRGAgZWxlbWVudCBhcyBmb2xsb3dzOiAgDQpgYGB7ciBleGFtcGxlXzFfaW5zdGFuY2VfMDIsIGVjaG89RkFMU0V9DQpmbl9Db2RlQ2h1bmtPdXQobGFuZyA9ICd4bWwnLCB0eHQgPSANCic8IS0tIEFkZGVkIHRvIHByZXZpb3VzIGluc3RhbnQgZG9jdW1lbnQgYXMgY2hpbGQgdG8gPHhicmw+IGVsZW1lbnQgLS0+DQo8dW5pdCBpZD0idXNkIiB4bWxuczppc280MjE3PSJodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvaXNvNDIxNyI+DQogIDxtZWFzdXJlPmlzbzQyMTc6VVNEPC9tZWFzdXJlPg0KPC91bml0PicpDQpgYGANCg0KIyMjIyMgX0NyZWF0aW5nIFhCUkwgaW5zdGFuY2UgYGZhY3RgXyAgDQpOb3cgdGhhdCB3ZSBoYXZlIGBGb29kYCBjb25jZXB0IGluIG91ciBYQlJMIFRheG9ub215IGFuZCBoYXZlIGEgY29udGV4dCB3aXRoIGBpZD0wMWAgYW5kIGEgdW5pdCBvZiBgaWQ9InVzZCJgIGluIG91ciBpbnN0YW5jZSBkb2N1bWVudCwgd2UgY2FuIGNyZWF0ZSBhIGZhY3QgZm9yIGBCb2JgJ3MgYEZvb2RgIGV4cGVuc2VzIGZvciB0aGUgcGVyaW9kIG9mIGBKYW51YXJ5IDIwMjBgIGZvciB0aGUgYW1vdW50IG9mIGA5MDBgIFVuaXRlZCBTdGF0ZXMgRG9sbGFycyBhcyBmb2xsb3dzOiAgDQpgYGB7ciBleGFtcGxlXzFfaW5zdGFuY2VfMDMsIGVjaG89RkFMU0V9DQpmbl9Db2RlQ2h1bmtPdXQobGFuZyA9ICd4bWwnLCB0eHQgPSANCic8IS0tIEFkZGVkIHRvIHByZXZpb3VzIGluc3RhbnQgZG9jdW1lbnQgYXMgY2hpbGQgdG8gPHhicmw+IGVsZW1lbnQgLS0+DQo8ZXhwZW5zZXM6Rm9vZA0KICBjb250ZXh0UmVmPSIwMSIgDQogIGRlY2ltYWxzPSIwIiANCiAgaWQ9ImZhY3RfMDAxIiANCiAgdW5pdFJlZj0idXNkIj45MDA8L2V4cGVuc2VzOkZvb2Q+JykNCmBgYA0KDQoNCiMjIyMgX1hCUkwgRGltZW5zaW9uc18gIA0KQXMgbWVudGlvbmVkIFhCUkwgcHJvdmlkZXMgdG9vbHMgZm9yIHJlcG9ydGluZyBtdWx0aWRpbWVuc2lvbmFsIGZhY3RzLCBhcyBtZW50aW9uZWQgY29yZSBkaW1lbnNpb25zIChDb25jZXB0LCBwZXJpb2QsIHJlcG9ydGluZyBlbnRpdHkgYW5kIHVuaXQpIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgWEJSTCBiYXNlIHNwZWNpZmljYXRpb25zLCBpbiBhZGRpdGlvbiB0byBzb21lIG90aGVyIHRvb2xzLCBmb3IgdGF4b25vbXkgZGVmaW5lZCBkaW1lbnNpb25zIGFuZCBtb3JlIGNvbXBsZXggbXVsdGlkaW1lbnNpb25hbCBzdHJ1Y3R1cmVzIF9bWEJSTCBEaW1lbnNpb25zIFNwZWNpZmljYXRpb25zXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3dvcmstcHJvZHVjdC1pbmRleC1ncm91cC1kaW1lbnNpb25zLWRpbWVuc2lvbnMuaHRtbClfIGFyZSB1c2VkLiAgDQoNCiMjIyMjIF9BZGRpdGlvbmFsIERpbWVuc2lvbnMgZnJvbSBiYXNlIFhCUkxfICANClhCUkwgZWxlbWVudCBgY29udGV4dGAgaGFzIDIgYWRkaXRpb25hbCBmZWF0dXJlcyB0aGF0IGNhbiBwcm92aWRlIGRpbWVuc2lvbmFsaXR5IHRvIGEgZmFjdCwgdGhlIGA8c2VnbWVudD5gIGFuZCBgPHNjZW5hcmlvPmAgYXMgZm9sbG93czogIA0KDQoqIGA8c2VnbWVudD5gOiBpcyBkZWZpbmVkIGluIFhCUkwgc3BlY2lmaWNhdGlvbnMgYXMgXyJhbiBvcHRpb25hbCBjb250YWluZXIgZm9yIGFkZGl0aW9uYWwgbWFyay11cCB0aGF0IHRoZSBwcmVwYXJlciBvZiBhbiBYQlJMIEluc3RhbmNlIFNIT1VMRCB1c2UgdG8gaWRlbnRpZnkgdGhlIGJ1c2luZXNzIHNlZ21lbnQgbW9yZSBjb21wbGV0ZWx5IGluIGNhc2VzIHdoZXJlIHRoZSBFbnRpdHkgaWRlbnRpZmllciBpcyBpbnN1ZmZpY2llbnQuIl8gSXQgc2hvdWxkIGFsc28gYmUgbWVudGlvbmVkIHRoYXQgdGhlIGA8c2VnbWVudD5gIGVsZW1lbnQgaXMgYSBjaGlsZCBlbGVtZW50IG9mIHRoZSBgPGVudGl0eT5gIGVsZW1lbnQgKHdoaWNoIGluIHR1cm4gaXMgYSBjaGlsZCBlbGVtZW50IG9mIHRoZSBgPGNvbnRleHQ+YCBlbGVtZW50KSB1c2VkIHRvIGxpbmsgd2l0aCB0YXhvbm9teSBkZWZpbmVkIGRpbWVuc2lvbiB1c2luZyBfWEJSTCBEaW1lbnNpb25zIFNwZWNpZmljYXRpb25zXy4gIA0KDQoqIGA8c2NlbmFyaW8+YDogWEJSTCBzcGVjaWZpY2F0aW9ucyBkZXNjcmliZXMgdGhpcyBlbGVtZW50IGFzIF8iQnVzaW5lc3MgZmFjdHMgY2FuIGJlIHJlcG9ydGVkIGFzIGFjdHVhbCwgYnVkZ2V0ZWQsIHJlc3RhdGVkLCBwcm8gZm9ybWEsIGV0Yy4gRm9yIGludGVybmFsIHJlcG9ydGluZyBwdXJwb3NlcywgdGhlcmUgY2FuIGJlIGFuIGV2ZW4gZ3JlYXRlciB2YXJpZXR5IG9mIGFkZGl0aW9uYWwgbWV0YWRhdGEgdGhhdCBwcmVwYXJlcnMgd2FudCB0byBhc3NvY2lhdGUgd2l0aCBpdGVtcy4gVGhlIG9wdGlvbmFsIDxzY2VuYXJpbz4gZWxlbWVudCBhbGxvd3MgYWRkaXRpb25hbCB2YWxpZCBtYXJrLXVwIChzZWUgbm90ZSBhYm92ZSByZWdhcmRpbmcgc2VnbWVudCkgdG8gYmUgaW5jbHVkZWQgZm9yIHRoaXMgcHVycG9zZS4iXyAgDQoNCioqU2VnbWVudCBhbmQgU2NlbmFyaW8gRXhhbXBsZSoqICANCg0KSW4gdGhlIG1vbnRobHkgZXhwZW5zZSByZXBvcnQgZXhhbXBsZSwgYXNzdW1lIHRoYXQgYEJvYmAgaGFzIDIgbG9jYXRpb25zIHRvIHRyYWNrIGV4cGVuc2VzIGZvciBgaG9tZWAgYW5kIGBvZmZpY2VgIChzZWdtZW50cyksIGFsc28gYXNzdW1lIHRoYXQgYEJvYmAgdHJhY2tzIGBidWRnZXRgIGFuZCBgYWN0dWFsc2AgKHNjZW5hcmlvcyksIHRvIGJlIGFibGUgdG8gaW5jbHVkZSB0aGVzZSBkaW1lbnNpb25zIGluIG91ciByZXBvcnQgd2UgbmVlZCBmaXJzdCB0byBjcmVhdGUgYW4gZXh0ZW5zaW9uIHRheG9ub215IHRvIGluY2x1ZGUgdGhlc2UgZWxlbWVudHMgYXMgZm9sbG93czoNCg0KYGBge3Igc2VnZW1lbnRfc2NlbmFyaW9feHNkLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmcgPSAneG1sJywgdHh0ID0gDQonPCEtLSBSZXBvcnQgc3BlY2lmaWMgdGF4b25vbXkgZXh0ZW5zaW9uIC0tPg0KPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXkiIA0KCQl4bWxuczpib2I9Imh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXkiIA0KCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KCQl4bWxuczp4YnJsaT0iaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlIj4NCgkJICANCgk8IS0tIFR5cGUgZm9yIHNlZ21lbnRzIC0tPg0KCTxzaW1wbGVUeXBlIG5hbWU9ImxvY2F0aW9uc1R5cGUiPg0KCQk8cmVzdHJpY3Rpb24gYmFzZT0idG9rZW4iPg0KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJob21lIi8+DQoJCQk8ZW51bWVyYXRpb24gdmFsdWU9Im9mZmljZSIvPg0KCQk8L3Jlc3RyaWN0aW9uPg0KCTwvc2ltcGxlVHlwZT4NCgkJICANCgk8IS0tIHJlcG9ydCBzcGVjaWZpYyBzZWdtZW50IHN1Yi1lbGVtZW50IC0tPg0KCTxlbGVtZW50IG5hbWU9ImxvY2F0aW9ucyIgdHlwZT0iYm9iOmxvY2F0aW9uc1R5cGUiIC8+DQoJCSAgDQoJCSAgDQoJPCEtLSBUeXBlIGZvciBzY2VuYXJpb3MgLS0+DQoJPHNpbXBsZVR5cGUgbmFtZT0iYWN0dWFsQnVkZ2V0VHlwZSI+DQoJCTxyZXN0cmljdGlvbiBiYXNlPSJ0b2tlbiI+DQoJCQk8ZW51bWVyYXRpb24gdmFsdWU9ImFjdHVhbCIvPg0KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJidWRnZXQiLz4NCgkJPC9yZXN0cmljdGlvbj4NCgk8L3NpbXBsZVR5cGU+DQoJCSAgDQoJPCEtLSByZXBvcnQgc3BlY2lmaWMgc2NuZWFyaW8gc3ViLWVsZW1lbnQgLS0+DQoJPGVsZW1lbnQgbmFtZT0iYWN0dWFsQnVkZ2V0IiB0eXBlPSJib2I6YWN0dWFsQnVkZ2V0VHlwZSIgLz4NCgkJICANCgkJICANCgkJICANCjwvc2NoZW1hPicpDQoNCmBgYA0KDQoqKl9Ob3RlXyoqICANCg0KPiBFbGVtZW50cyBjb250YWluZWQgYnkgdGhlIGA8c2NlbmFyaW8+YCBlbGVtZW50IE1VU1QgTk9UIGJlIGRlZmluZWQgaW4gdGhlIGh0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9pbnN0YW5jZSBuYW1lc3BhY2UuIEFsc28sIHRoZXkgTVVTVCBOT1QgYmUgaW4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlIG5hbWVzcGFjZS4gVGhlIDxzY2VuYXJpbz4gZWxlbWVudCBNVVNUIE5PVCBiZSBlbXB0eS4gYHIgdHVmdGU6OnF1b3RlX2Zvb3RlcignLS0tIFtYQlJMIHNwZWNpZmljYXRpb25zXShodHRwczovL3d3dy54YnJsLm9yZy9TcGVjaWZpY2F0aW9uL1hCUkwtMi4xL1JFQy0yMDAzLTEyLTMxL1hCUkwtMi4xLVJFQy0yMDAzLTEyLTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxMy0wMi0yMC5odG1sI180LjcuNCknKWANCg0KVG8gcmVwb3J0IGZhY3RzIHVzaW5nIGxvY2F0aW9ucyBhbmQvb3IgYnVkZ2V0IHZzIGFjdHVhbCBlbGVtZW50cywgbmFtZXNwYWNlIGBodHRwOi8vYm9icmVwb3J0LmNvbS94YnJsL3RheG9ub215YCBtdXN0IGJlIHJlZmVyZW5jZWQgaW4gb3VyIGluc3RhbmNlIHJlcG9ydCB0byBiZSBhYmxlIGFjY2VzcyB0aGVzZSBlbGVtZW50cywgdGhlbiB3ZSBuZWVkIHRvIGNyZWF0ZSBjb250ZXh0cyB0aGF0IHJlZmVyZW5jZSB0aGVzZSBlbGVtZW50cywgYW5kIGZpbmFsbHkgd2UgY2FuIHJlZmVyZW5jZSB0aGVzZSBjb250ZXh0cyBpbiB0aGUgcmVwb3J0ZWQgZmFjdHMgYXMgZm9sbG93czogIA0KDQpgYGB7ciBzZWdtZW50X3NjZW5hcmlvX2luc3RhbmNlLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmcgPSAneG1sJywgdHh0ID0gDQonPCEtLSBBZGRlZCB0byBwcmV2aW91cyBpbnN0YW50IGRvY3VtZW50IGFzIGNoaWxkcmVuIHRvIDx4YnJsPiBlbGVtZW50IC0tPg0KICA8eGJybCAuLi4uLi4uIHhtbG5zOmJvYj0iaHR0cDovL2JvYnJlcG9ydC5jb20veGJybC90YXhvbm9teSI+DQogIDwhLS0gLi4uIGF0IGxlYXN0IG9uZSBsaW5rOnNjaGVtYVJlZiBlbGVtZW50IGdvZXMgaGVyZSAuLi4gLS0+DQogICAgPGNvbnRleHQgaWQ9IjAyIj4NCiAgICAgIDxlbnRpdHk+DQogICAgICAgIDxpZGVudGlmaWVyIHNjaGVtZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ib2IiPkJvYjwvaWRlbnRpZmllcj4NCiAgICAgICAgPHNlZ21lbnQ+DQogICAgICAgICAgPGJvYjpsb2NhdGlvbnM+Ym9iOmhvbWU8L2JvYjpsb2NhdGlvbj4NCiAgICAgIDwvc2VnbWVudD4NCiAgICAgIDwvZW50aXR5Pg0KICAgICAgPHBlcmlvZD4NCiAgICAgICAgPHN0YXJ0RGF0ZT4yMDIwLTAxLTAxPC9zdGFydERhdGU+DQogICAgICAgIDxlbmREYXRlPjIwMjAtMDEtMzE8L2VuZERhdGU+DQogICAgICA8L3BlcmlvZD4NCiAgICAgIDxzY2VuYXJpbz4NCiAgICAgICAgICA8Ym9iOmFjdHVhbEJ1ZGdldD5ib2I6YWN0dWFsPC9ib2I6YWN0dWFsQnVkZ2V0Pg0KICAgICAgPC9zY2VuYXJpbz4NCiAgICA8L2NvbnRleHQ+JykNCg0KYGBgDQoNCk5vdyBoYXZpbmcgY29udGV4dCBgaWQ9MDJgIHdlIGNhbiByZWZlcmVuY2UgdGhlIGZhY3RzIHRoYXQgaW5jbHVkZSBgYWN0dWFsYCBmaWd1cmVzIGZvciBsb2NhdGlvbiBgaG9tZWAgaW4gb3VyIGluc3RhbmNlIHJlcG9ydC4gIA0KDQoNCiMjIyMjIFRheG9ub215IGRlZmluZWQgZGltZW5zaW9ucyAgIA0KVGF4b25vbXkgZGVmaW5lZCBkaW1lbnNpb25zIGVuYWJsZSBjcmVhdGlvbiBvZiBjb21wbGV4IHN0cnVjdHVyZXMgaW4gWEJSTCB0YXhvbm9teSBhbmQgcmVwb3J0cy4gVGhpcyBpcyBhY2hpZXZlZCB0aHJvdWdoIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBjb25jZXB0cyBhbmQgbGlua2Jhc2VzLCB0aGlzIGlzIGJlc3QgZGVzY3JpYmVkIGluIFRESCBzZWN0aW9uIDIuMi41IHBhZ2UgMjEgYXMgZm9sbG93czogIA0KDQo+QSB0YXhvbm9teS1kZWZpbmVkIGRpbWVuc2lvbiBpcyBhIGdyb3VwaW5nIG9mIGNvbmNlcHRzIHRoYXQgaXMgdXNlZCB0byBhZGQgb3JnYW5pemF0aW9uYWwgc3RydWN0dXJlIHRvIGZhY3RzLiBUaGVzZSBkaW1lbnNpb25hbCBjb25jZXB0cyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCBhIGRhdGEgcG9pbnQgYnV0IHJhdGhlciBhcmUgZW1wbG95ZWQgdG8gaW5kaWNhdGUgYWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc2ltcGxlIHNlbWFudGljIGlkZW50aWZpZXIgb3Igd2hhdCBpcyBwcm92aWRlZCB0aHJvdWdoIGFueSBvZiB0aGUgb3RoZXIgY29yZSBkaW1lbnNpb25zLiBFeHBhbmRpbmcgdGhlIGV4cGVuc2UgZXhhbXBsZSBieSBhdHRyaWJ1dGluZyB0aGUgbW9udGhseSBleHBlbnNlcyB0byB0d28gcGVvcGxlIGluIHRoZSBzYW1lIGhvdXNlaG9sZCBjcmVhdGVzIGEgbGV2ZWwgb2YgY29tcGxleGl0eSB0aGF0IGNhbm5vdCBiZSBlYXNpbHkgcmVwcmVzZW50ZWQgd2l0aCBvbmx5IGNvbmNlcHRzLiBQcmV2aW91c2x5LCB0aGVyZSB3ZXJlIG9ubHkgdHdvIGRpbWVuc2lvbnM6IGV4cGVuc2VzIChhcyByb3dzKSBhbmQgbW9udGhzIChhcyBjb2x1bW5zKS5gciB0dWZ0ZTo6cXVvdGVfZm9vdGVyKCctLS0gW1RESCBzZWN0aW9uIDIuMi44IHBhZ2UgMjRdKGh0dHBzOi8veGJybHVzLmdpdGh1Yi5pby9kb2NzL3RkaC5odG1sKScpYCAgDQoNCioqX1NvbWUgWEJSTCBEaW1lbnNpb25zIHRlcm1pbm9sb2d5XyoqICANCg0KKiBgRGltZW5zaW9uYDogQSBxdWFsaWZ5aW5nIGNoYXJhY3RlcmlzdGljIHRoYXQgaXMgdXNlZCB0byB1bmlxdWVseSBkZWZpbmUgYSBkYXRhIHBvaW50IChvdGhlciB0aGFuIGNvcmUgZGltZW5zaW9ucykgZm9yIGV4YW1wbGUgYSAiR2VvZ3JhcGh5IERpbWVuc2lvbiIuDQoqIGBEb21haW5gOiBBIHNldCBvZiByZWxhdGVkIHZhbHVlcy4gRXhhbXBsZXMgb2YgZGlmZmVyZW50IGRvbWFpbnMgZm9yIHVzZSBvbiBhICJnZW9ncmFwaHkiIGRpbWVuc2lvbiB3b3VsZCBiZSAiQ291bnRyaWVzIiwgIkNvbnRpbmVudHMiIG9yICJTdGF0ZXMiLiBJbiBYQlJMLCBkb21haW5zIGFyZSBkZWZpbmVkIHVzaW5nIHRheG9ub215IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZ3JvdXAgZG9tYWluIG1lbWJlcnMuICANCiogYERvbWFpbiBtZW1iZXJgOiBBbiBlbGVtZW50IHJlcHJlc2VudGluZyBvbmUgb2YgdGhlIHBvc3NpYmlsaXRpZXMgd2l0aGluIGEgZG9tYWluLiAgDQoqIGBDdWJlYDogQSBjdWJlIGlzIGRlZmluZWQgYnkgY29tYmluaW5nIGEgc2V0IG9mIGRpbWVuc2lvbnMgd2l0aCBhIHNldCBvZiBjb25jZXB0cy4gQ3ViZXMgYXJlIG9mdGVuIHJlZmVycmVkIHRvIGFzICJoeXBlcmN1YmVzIiwgYXMgdW5saWtlIGEgcGh5c2ljYWwsIDMtZGltZW5zaW9uYWwgY3ViZSwgYSBoeXBlcmN1YmUgbWF5IGhhdmUgYW55IG51bWJlciBvZiBkaW1lbnNpb25zLg0KDQpBbGwgdGhlIGFib3ZlIGNvbnN0cnVjdHMgYXJlIGRlZmluZWQgYXMgY29uY2VwdHMsIGJ1dCB1c2luZyBYQlJMIHNwZWNpZmljYXRpb25zIGZvciB0aGUgYEB0eXBlYCBhbmQgYEBzdWJzdGl0dXRpb25Hcm91cGAgYXR0cmlidXRlcyB1c2VkIGZvciBkZWZpbmluZyBhIGNvbmNlcHQuICANCg0KVGhlIFRESCBhdCB0aGlzIHNlY3Rpb24sIHNwbGl0cyB0aGUgbW9udGhseSBleHBlbnNlcyBieSBCb2IncyBjaGlsZHJlbiwgd2l0aCBlYWNoIG1vbnRoIHNwbGl0IGludG8gMiBjb2x1bW5zIGZvciBlYWNoIG9mIEJvYidzIGNoaWxkcmVuLiBBc3N1bWUgdGhhdCB3ZSB3YW50IHRvIG9yZ2FuaXplIHRoaXMgaW5mb3JtYXRpb24gaW4gWEJSTCBieSBkb2luZyB0aGUgZm9sbG93aW5nOiAgDQoNCiogQ3JlYXRlIGEgZ3JvdXBpbmcgY29uY2VwdCBvciBoZWFkZXIgY2FsbGVkIGBleHBlbnNlc2AgdG8gZ3JvdXAgYWxsIHRoZSBleHBlbnNlcyB0b2dldGhlciwgIA0KKiBDcmVhdGUgYHBlcnNvbnNgIGRpbWVuc2lvbiwgYW5kIHRoZW4gY3JlYXRlIGEgYGRvbWFpbmAgZm9yIGBib2JDaGlsZHJlbkRvbWFpbmAgYW5kIGBkb21haW4gbWVtYmVyYCBmb3IgZWFjaCBjaGlsZCByZWZlcmVuY2VkIGluIHRoZSByZXBvcnQuICANCg0KVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gWEJSTCBhcyBmb2xsb3dzOiAgDQpgYGB7ciBkaW1lbnNpb25fc2NoZW1hLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmcgPSAneG1sJywgdHh0ID0gDQonPCEtLSBSZXBvcnQgc3BlY2lmaWMgdGF4b25vbXkgZXh0ZW5zaW9uIC0tPg0KPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXkiIA0KCQl4bWxuczpib2I9Imh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXkiIA0KCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KCQl4bWxuczp4YnJsaT0iaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlIj4NCgkJPCEtLSBub3RlIGhlcmUgd2UgaW5jbHVkZWQgeGJybCBkaW1lbnNpb25zIHNwZWNzIHRvIGhhdmUgYWNjZXNzIHRvIGl0cyBlbGVtZW50cyAtLT4NCgkJeG1sbnM6eGJybGR0PSJodHRwOi8veGJybC5vcmcvMjAwNS94YnJsZHQiDQoJCXhtbG5zOmR0ci10eXBlcz0iaHR0cDovL3d3dy54YnJsLm9yZy9kdHIvdHlwZS8yMDIwLTAxLTIxIg0KCQkNCgkJPCEtLSBjcmVhdGUgYSBncm91cGluZyBleHBlbnNlIGVsZW1lbnQgLS0+DQoJCTxlbGVtZW50IGFic3RyYWN0PSJ0cnVlIiANCgkJICAgICAgICAgaWQ9ImV4cGVuc2VzX2Fic3RyYWN0IiANCgkJICAgICAgICAgbmFtZT0iRXhwZW5zZXNBYnN0cmFjdCIgDQoJCSAgICAgICAgIG5pbGxhYmxlPSJ0cnVlIg0KCQkgICAgICAgICB4YnJsaTpiYWxhbmNlPSJkZWJpdCINCgkJICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXA9InhicmxpOml0ZW0iIA0KCQkgICAgICAgICB0eXBlPSJ4YnJsaTptb25ldGFyeUl0ZW1UeXBlIiANCgkJICAgICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iLz4NCgkJDQoJCTwhLS0gY3JlYXRlIHBlcnNvbnMgZGltZW5zaW9uIC0tPg0KCQk8ZWxlbWVudCBhYnN0cmFjdD0idHJ1ZSIgDQoJCSAgICAgICAgIGlkPSJkaW1fMDFfcGVyc29ucyIgDQoJCSAgICAgICAgIG5hbWU9InBlcnNvbnNEaW0iIA0KCQkgICAgICAgICBuaWxsYWJsZT0idHJ1ZSIgDQoJCSAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJ4YnJsZHQ6ZGltZW5zaW9uSXRlbSIgDQoJCSAgICAgICAgIHR5cGU9InhicmxpOnN0cmluZ0l0ZW1UeXBlIiANCgkJICAgICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iLz4NCgkJPCEtLSBjcmVhdGUgY2hpbGRyZW4gZG9tYWluIC0tPiAgICAgICAgDQoJCTxlbGVtZW50IGFic3RyYWN0PSJ0cnVlIiANCgkJICAgICAgICBpZD0iZG9tYWluXzAxX2NoaWxkcmVuIiANCgkJICAgICAgICBuYW1lPSJDaGlsZHJlbkRvbWFpbiIgDQoJCSAgICAgICAgbmlsbGFibGU9InRydWUiIA0KCQkgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJ4YnJsaTppdGVtIiANCgkJICAgICAgICB0eXBlPSJkdHItdHlwZXM6ZG9tYWluSXRlbVR5cGUiIA0KCQkgICAgICAgIHhicmxpOnBlcmlvZFR5cGU9ImR1cmF0aW9uIi8+DQoJCSAgICAgICAgICANCgkJICA8IS0tIGNyZWF0ZSBkb21haW4gbWVtYmVyIGZvciBlYWNoIGNoaWxkIC0tPg0KCQkgIDxlbGVtZW50IA0KCQkgICAgICBhYnN0cmFjdD0idHJ1ZSIgDQoJCSAgICAgIGlkPSJtZW1iZXJzXzAxX2NoaWxkT25lTWVtYmVyIg0KCQkgICAgICBuYW1lPSJDaGlsZE9uZU1lbWJlciINCgkJICAgICAgbmlsbGFibGU9InRydWUiIA0KCQkgICAgICBzdWJzdGl0dXRpb25Hcm91cD0ieGJybGk6aXRlbSIgDQoJCSAgICAgIHR5cGU9ImR0ci10eXBlczpkb21haW5JdGVtVHlwZSIgDQoJCSAgICAgIHhicmxpOnBlcmlvZFR5cGU9ImR1cmF0aW9uIi8+DQoJCSAgPGVsZW1lbnQgDQoJCSAgICAgIGFic3RyYWN0PSJ0cnVlIiANCgkJICAgICAgaWQ9Im1lbWJlcnNfMDJfY2hpbGRUd29NZW1iZXIiDQoJCSAgICAgIG5hbWU9IkNoaWxkVHdvTWVtYmVyIg0KCQkgICAgICBuaWxsYWJsZT0idHJ1ZSIgDQoJCSAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJ4YnJsaTppdGVtIiANCgkJICAgICAgdHlwZT0iZHRyLXR5cGVzOmRvbWFpbkl0ZW1UeXBlIiANCgkJICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iLz4NCjwvc2NoZW1hPg0KPCEtLSBub3RlIGF0dHJpYnV0ZXMgdXNlZiBmcm9tIGR0ci10eXBlcyBhbmQgeGJybGR0IG5hbWVzcGFjZXM+JykNCg0KYGBgDQogIA0KKipfTm90ZXNfKiogQWxsIGVsZW1lbnRzIGRlZmluZWQgYWJvdmUgaGFzIHRoZSBgQGFic3RyYWN0YCBhdHRyaWJ1dGUgYXMgYHR1cmVgLCB0aGlzIG1lYW5zIHRoYXQgdGhpcyBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIHRvIGJlIHVzZWQgaW4gWEJSTCBpbnN0YW5jZSBkb2N1bWVudCB0byByZXBvcnQgZmFjdHMsIHRoaXMgZWxlbWVudCBpcyBvbmx5IGZvciBvcmdhbml6YXRpb24gcHVycG9zZXMuDQoNCk5vdyB3ZSBjYW4gcmVmZXJlbmNlIHRoZSBkaW1lbnNpb24gaW4gdGhlIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCB0aHJvdWdoIGA8Y29udGV4dD5gIGVsZW1lbnQgYXMgZm9sbG93czogIA0KYGBge3IgZGltX2luc3RhbmNlLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmcgPSAneG1sJywgdHh0ID0gDQonPCEtLSBBZGRlZCB0byBwcmV2aW91cyBpbnN0YW50IGRvY3VtZW50IGFzIGNoaWxkcmVuIHRvIDx4YnJsPiBlbGVtZW50IC0tPg0KICA8eGJybCAuLi4uLi4uIHhtbG5zOmJvYj0iaHR0cDovL2JvYnJlcG9ydC5jb20veGJybC90YXhvbm9teSINCiAgICAgICAgICAgICAgICB4bWxuczp4YnJsZGk9Imh0dHA6Ly94YnJsLm9yZy8yMDA2L3hicmxkaSI+DQogIDwhLS0gLi4uIGF0IGxlYXN0IG9uZSBsaW5rOnNjaGVtYVJlZiBlbGVtZW50IGdvZXMgaGVyZSAuLi4gLS0+DQogICAgPGNvbnRleHQgaWQ9IjAzIj4NCiAgICAgIDxlbnRpdHk+DQogICAgICAgIDxpZGVudGlmaWVyIHNjaGVtZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ib2IiPkJvYjwvaWRlbnRpZmllcj4NCiAgICAgIDwvZW50aXR5Pg0KICAgICAgPHBlcmlvZD4NCiAgICAgICAgPHN0YXJ0RGF0ZT4yMDIwLTAxLTAxPC9zdGFydERhdGU+DQogICAgICAgIDxlbmREYXRlPjIwMjAtMDEtMzE8L2VuZERhdGU+DQogICAgICA8L3BlcmlvZD4NCiAgDQogICAgICA8c2VnbWVudD4NCiAgICAgICAgICA8Ym9iOmxvY2F0aW9ucz5ib2I6aG9tZTwvYm9iOmxvY2F0aW9uPg0KICAgICAgICAgIDx4YnJsZGk6ZXhwbGljaXRNZW1iZXINCiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbj0iYm9iOnBlcnNvbnNEaW0iPmJvYjpDaGlsZE9uZU1lbWJlcg0KICAgICAgICAgIDwveGJybGRpOmV4cGxpY2l0TWVtYmVyPg0KICAgICAgPC9zZWdtZW50Pg0KICANCiAgICAgIDxzY2VuYXJpbz4NCiAgICAgICAgICA8Ym9iOmFjdHVhbEJ1ZGdldD5ib2I6YWN0dWFsPC9ib2I6YWN0dWFsQnVkZ2V0Pg0KICAgICAgPC9zY2VuYXJpbz4NCiAgDQogICAgPC9jb250ZXh0PicpDQoNCmBgYA0KDQpOb3cgZmFjdHMgcmVwb3J0aW5nIGFjdHVhbCBleHBlbnNlcywgZm9yIGhvbWUgbG9jYXRpb24sIHJlbGF0aW5nIHRvIGNoaWxkIG9uZSBmb3IgSmFudWFyeSAyMDIwIGNhbiB1c2UgdGhlIGFib3ZlIGNvbnRleHQgYW5kIGhhdmUgYWxsIGV4cGVuc2VzIGdyb3VwZWQgdW5kZXIgb25lIGhlYWRpbmcgdXNpbmcgdGhlIGBFeHBlbnNlc0Fic3RyYWN0YCBlbGVtZW50Lg0KDQoqKl9Ob3Rlc18qKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIG1lbWJlcnMgYGV4cGxpY2l0IG1lbWJlcnNgLCBhbmQgYHR5cGVkIG1lbWJlcmAsIHRoZSBmaXJzdCB0eXBlIGlzIHdoZXJlIG1lbWJlcnMgYXJlIGV4cGxpY2l0bHkgZGVmaW5lZCBpbiB0aGUgdGF4b25vbXkgYW5kIG5vIG90aGVyIG1lbWJlcnMgY2FuIGJlIHVzZWQgd2l0aCB0aGF0IGRvbWFpbiBleGNlcHQgdGhlIGRlZmluZWQgbWVtYmVycy4gT24gdGhlIG90aGVyIGhhbmQgYHR5cGVkIG1lbWJlcnNgLCBvbmx5IHR5cGUgb2YgdGhlIG1lbWJlciBpcyBkZWZpbmVkIGluIHRoZSB0YXhvbm9teSwgYW5kIGFueSBjYW4gYmUgdXNlZCBpZiBpdCBtYXRjaGVkIHRoZSB0eXBlLiAgDQoNCktlZXAgaW4gbWluZCB0aGF0IFhCUkwgZGltZW5zaW9ucyBzcGVjaWZpY2F0aW9ucyByZWx5IGhlYXZpbHkgb24gdGhlIGxpbmtpbmcgbWVjaGFuaXNtcyBwcm92aWRlZCBieSBYQlJMIHRocm91Z2ggbGlua2Jhc2VzLCB3aGljaCB3aWxsIGJlIHRoZSBuZXh0IHRvcGljLiAgDQoNCiMjIyBYQlJMIExpbmtiYXNlcyAgDQoNCldlIGhhdmUgbG9va2VkIGF0IGhvdyB0byBjcmVhdGUgdGF4b25vbXkgZWxlbWVudHMgYW5kIHRheG9ub215IGRlZmluZWQgZGltZW5zaW9ucywgYW5kIGhvdyB0byB1c2UgdGhlc2UgZWxlbWVudHMgaW4gWEJSTCBpbnN0YW5jZSByZXBvcnQsIFhCUkwgbGlua2Jhc2VzIChiYXNlZCBvbiBYTUwgWExpbmspIHByb3ZpZGVzIGZvciBhIG1lY2hhbmlzbSB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRob3NlIGVsZW1lbnRzIGFuZCB3aXRoIG90aGVyIGludGVybmFsIG9yIGV4dGVybmFsIHJlc291cmNlcyB0byBjcmVhdGUgYSBtZWFuaW5nZnVsIHNlbGYtZGVzY3JpYmluZyBkYXRhIHN0cnVjdHVyZS4gIA0KDQoNCiMjIyMgVGhlIGJhc2ljcyAgDQpBcyBtZW50aW9uZWQgWEJSTCBtYWtlcyB1c2Ugb2YgWE1MIFhMaW5rIHNwZWNpZmljYXRpb25zLCBnZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSB0d28gbWFpbiBjYXRlZ29yaWVzIG9mIGxpbmtzOiAgDQoNCiogYFNpbXBsZSBMaW5rc2A6IEEgc2ltcGxlIGxpbmsgaW4gWExpbmsgY3JlYXRlcyBhIHVuaWRpcmVjdGlvbmFsIGh5cGVybGluayBmcm9tIG9uZSBlbGVtZW50IHRvIGFub3RoZXIgdGhyb3VnaCBhIFVSSS4gVGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbGluayAodGhlIHNvdXJjZSBlbGVtZW50KSBpcyBsaW5rZWQgdG8gYSBkZXN0aW5hdGlvbiBlbGVtZW50LiBUaGlzIGRlc3RpbmF0aW9uIGVsZW1lbnQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgc291cmNlIGVsZW1lbnQuIFRoaXMgaXMgY29tbW9uIGluIEhUTUwgaHlwZXJsaW5raW5nLCB3aGVyZSBhIGxpbmsgb24gb25lIHdlYnNpdGUgbWF5IGxlYWQgYSB1c2VyIHRvIGFuIGFkZGl0aW9uYWwgd2Vic2l0ZSwgYnV0IHRoYXQgYWRkaXRpb25hbCB3ZWJzaXRlIG1heSBub3QgY29udGFpbiBhIGxpbmsgYmFjayB0byB0aGUgc291cmNlIGxvY2F0aW9uLiAgDQoNCiogYEV4dGVuZGVkIExpbmtzYDogUHJvdmlkZSBmb3IgbXVsdGlwbGUgcmVzb3VyY2VzIGF0IHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gdG8gYmUgY29ubmVjdGVkIHZpYSBtdWx0aXBsZSBhcmNzLiBBbiBhcmMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbiwgZGVzdGluYXRpb24sIGFuZCB0aGUgYmVoYXZpb3Igb2YgYSBsaW5rIGJldHdlZW4gdHdvIHJlc291cmNlcy4gVGhlIG9yaWdpbiByZXNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlIGFyZSBkZWZpbmVkIGJ5IGxhYmVscy4gKipfVGhyb3VnaCBvbmUgb3IgbW9yZSBhcmNzLCBleHRlbmRlZCBsaW5rcyBhY2hpZXZlIGNvbXBsZXggY29ubmVjdGlvbnMgYW1vbmcgbXVsdGlwbGUgcmVzb3VyY2VzXyoqLiBMaWtlIHNpbXBsZSBsaW5rcywgZXh0ZW5kZWQgbGlua3MgY2FuIGRlZmluZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gZWxlbWVudHMgd2l0aGluIHRoZSBzYW1lIG5hbWVzcGFjZSBvciBhY3Jvc3MgZGlmZmVyZW50IG5hbWVzcGFjZXMuICANCg0KSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCAqKkV4dGVuZGVkIExpbmtzKiogY3JlYXRlcyByZWxhdGlvbnNoaXBzIGJldHdlZW4gZWxlbWVudHMgdXNpbmcgYGFyY3NgIHRoYXQgZGVzY3JpYmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgcmVsYXRpb25zaGlwLg0KDQpYQlJMIHNwZWNpZmljYXRpb25zIGRlZmluZXMgc2V2ZXJhbCB0eXBlcyBvZiBsaW5rcyBiYXNlZCBvbiBYTGluayBzcGVjcywgbW9zdCBjb21tb24gbGlua3MgYW5kIGFyY3MgYXJlIFtbYmFzZWQgb24gWEJSTCBHbG9zc2FyeV0oaHR0cHM6Ly93d3cueGJybC5vcmcvZ3VpZGFuY2UveGJybC1nbG9zc2FyeSldOiAgDQoNCiogYFByZXNlbnRhdGlvbiBMaW5rc2A6IEFuIGV4dGVuZGVkIGxpbmsgcHJvdmlkaW5nIGZvciB0aGUgb3JnYW5pc2F0aW9uIG9mIHRheG9ub215IGVsZW1lbnRzIGludG8gYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIHdpdGggdGhlIGFpbSBvZiBwcm92aWRpbmcgYSBtZWFucyBvZiB2aXN1YWxpemluZyBvciBuYXZpZ2F0aW5nIHRoZSB0YXhvbm9teS4gW0F0IGEgdGVjaG5pY2FsIGxldmVsLCB0aGUgcHJlc2VudGF0aW9uIHRyZWUgaXMgZGVmaW5lZCB1c2luZyB0aGUgYHBhcmVudC1jaGlsZCBhcmNyb2xlYCBpbiB0aGUgWEJSTCBzcGVjaWZpY2F0aW9uXQ0KDQoqIGBDYWxjdWxhdGlvbiBMaW5rc2A6IEFuIGV4dGVuZGVkIGxpbmsgcHJvdmlkaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjb25jZXB0cyBpbiBhIHRheG9ub215IGZvciB0aGUgcHVycG9zZSBvZiBkZXNjcmliaW5nIGFuZCB2YWxpZGF0aW5nIHNpbXBsZSB0b3RhbHMgYW5kIHN1YnRvdGFscy4gW0F0IGEgdGVjaG5pY2FsIGxldmVsLCB0aGVzZSByZWxhdGlvbnNoaXBzIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBgc3VtbWF0aW9uLWl0ZW0gYXJjcm9sZWAgaW4gdGhlIFhCUkwgc3BlY2lmaWNhdGlvbl0gIA0KDQoqIGBMYWJlbCBsaW5rc2A6IEFuIGV4dGVuZGVkIGxpbmsgcHJvdmlkaW5nIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gY29uY2VwdCBhbmQgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgYSB0YXhvbm9teSBjb21wb25lbnQuIFhCUkwgbGFiZWxzIGNhbiBiZSBkZWZpbmVkIGluIG11bHRpcGxlIGxhbmd1YWdlcyBhbmQgY2FuIGJlIG9mIG11bHRpcGxlIHR5cGVzLCBzdWNoIGFzIGEgInN0YW5kYXJkIGxhYmVsIiwgd2hpY2ggcHJvdmlkZXMgYSBjb25jaXNlIG5hbWUgZm9yIHRoZSBjb21wb25lbnQsIG9yIGEgImRvY3VtZW50YXRpb24gbGFiZWwiIHdoaWNoIHByb3ZpZGVzIGEgbW9yZSBjb21wbGV0ZSBkZWZpbml0aW9uIG9mIHRoZSBjb21wb25lbnQuIEV4YW1wbGUgb2YgYXJjcm9sZXMgYGxhYmVsYCwgYHRlcnNlTGFiZWxgLCBgcGVyaW9kU3RhcnRMYWJlbGAsIGBwZXJpb2RFbmRMYWJlbGAsIGB0b3RhbExhYmVsYA0KDQoqIGBEZWZpbml0aW9uIExpbmtzYDogQW4gZXh0ZW5kZWQgcHJvdmlkaW5nIGZvciByZWxhdGlvbnNoaXBzIHRoYXQgYXJyYW5nZXMgcGFpcnMgb2YgY29uY2VwdHMgaW4gYSBzcGVjaWZpYyBzZW1hbnRpYyByZWxhdGlvbnNoaXAuIFRoZXNlIHJlbGF0aW9uc2hpcHMgbWF5IGJlIGFib3ZlIGFuZCBiZXlvbmQgY2FsY3VsYXRpb24gb3IgcHJlc2VudGF0aW9uIHJlbGF0aW9uc2hpcHMuIENvbmNlcHQgY29yZSBkaW1lbnNpb25zIGNhbm5vdCBiZSB1c2VkIGluIGEgZGVmaW5pdGlvbiByZWxhdGlvbnNoaXAsIGFuZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgZGltZW5zaW9uYWwgcmVsYXRpb25zaGlwcyBpbiBYQlJMIERpbWVuc2lvbnMgc3BlY2lmaWNhdGlvbnMuIEV4YW1wbGUgYXJjcm9sZXMgYGh5cGVyY3ViZS1kaW1lbnNpb25gLCBgZGltZW5zdGlvbi1kb21haW5gLCBgZG9tYWluLW1lbWJlcmAsIGBkaW1lbnN0aW9uLWRlZnVhbHRgICANCg0KKiBgUmVmZXJlbmNlIGxpbmtgOiBBbiBleHRlbmRlZCBsaW5rIHByb3ZpZGluZyBmb3IgcmVsYXRpb24gYmV0d2VlbiBlbGVtZW50cyBvZiB0aGUgdGF4b25vbXkgYW5kIGV4dGVybmFsIHJlZmVyZW5jZSBzdWNoIGFzIGFjY291bnRpbmcgc3RhbmRhcmRzLCBvciBsYXdzLiBFeGFtcGxlIGFyY3JvbGUgYGNvbmNlcHQtcmVmZXJlbmNlYC4gIA0KDQoqIGBGb3JtdWxhIGxpbmtgOiBBbiBleHRlbmRlZCBsaW5rIHByb3ZpZGluZyByZWxhdGlvbnMgbmVjZXNzYXJ5IHRvIGRlZmluZSBmb3JtdWxhZSAoWEJSTCBGb3JtdWxhIFNwZWNpZmljYXRpb24pIHVzZWQgaW4gdmFsaWRhdGluZyBYQlJMIGluc3RhbmNlcy4gRXhhbXBsZSBhcmNyb2xlIGB2YXJpYWJsZS1zZXRgLCBgdmFyaWFibGUtc2V0LWZpbHRlcmAuICANCg0KKiBgVGFibGUgTGlua2Jhc2VgOiBhbiBleHRlbmRlZCBsaW5rIHByb3ZpZGluZyByZWxhdGlvbnMgbmVlZGVkIGZvciB0YWJ1bGFyIHZpZXcgb2YgYSB0YXhvbm9teSBvciByZXBvcnQgdGhhdCBpcyB1c2VkIGZvciBwcmVzZW50YXRpb24gb3IgZGF0YSBlbnRyeSBwdXJwb3Nlcy4gWEJSTCByZXBvcnRpbmcgdGVtcGxhdGVzIGNhbiBzdXBwb3J0IGNvbXBsZXgsIG11bHRpLWRpbWVuc2lvbmFsIHJlcG9ydHMsIHN1Y2ggYXMgdGhvc2Ugc2VlbiBpbiBwcnVkZW50aWFsIHJlcG9ydGluZywgYW5kIHByb3ZpZGUgYSBidXNpbmVzcyB1c2VyLWZyaWVuZGx5IHZpZXcgb2YgdGhlIGRhdGEuIFhCUkwgcmVwb3J0aW5nIHRlbXBsYXRlcyBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gY2xvc2VkIHJlcG9ydGluZyBwcm9ncmFtcywgd2hlcmUgYSB0ZW1wbGF0ZSBpcyBwcmVzY3JpYmVkIGJ5IHRoZSBjb2xsZWN0b3IuIFtBdCBhIHRlY2huaWNhbCBsZXZlbCwgWEJSTCByZXBvcnRpbmcgdGVtcGxhdGVzIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBUYWJsZSBMaW5rYmFzZSBzcGVjaWZpY2F0aW9uXSANCg0KKiBgZm9vdG5vdGUgbGlua3NgOiBBIGZvb3Rub3RlIGFkZHMgZnVydGhlciBleHBsYW5hdG9yeSBpbmZvcm1hdGlvbiB0byBhIHN0YXRlbWVudCBvciBmYWN0LiBJbiBYQlJMLCBmb290bm90ZXMgYXJlIGNyZWF0ZWQgdGhyb3VnaCByZWxhdGlvbnNoaXBzIGJldHdlZW4gbm90ZSB0ZXh0IGFuZCBmYWN0cyB1c2luZyB0aGUgZm9vdG5vdGUgcmVsYXRpb25zaGlwcy4gT25lIGluc3RhbmNlIG9mIGZvb3Rub3RlIHRleHQgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBmYWN0cy4gVGhlIG5vdGUgY29yZSBJRCBkaW1lbnNpb24gaXMgdGhlIGRpbWVuc2lvbiBvbiB0aGUgZmFjdCB0aGF0IGFzc29jaWF0ZXMgdGhlIGZhY3Qgd2l0aCBvbmUgb3IgbW9yZSBmb290bm90ZXMgYXJjcy4NCg0KKiBgR2VuZXJpYyBMaW5rc2A6IEEgbGluayB0eXBlIHdpdGggbm8gcHJlZGVmaW5lZCBzZW1hbnRpY3Mgb3IgY29uc3RyYWludHMuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBmb3Igb3RoZXIgc3BlY2lmaWNhdGlvbnMsIHN1Y2ggYXMgR2VuZXJpYyBMYWJlbHMgMS4wIGFuZCBHZW5lcmljIFJlZmVyZW5jZXMgMS4wIHRvIGRlZmluZSByZWxhdGlvbnNoaXBzIHdpdGggcGFydGljdWxhciBzZW1hbnRpY3MuDQoNCiMjIyMgRXh0ZW5kZWQgTGlua3MgVXNhZ2UgaW4gWEJSTCAgDQpMaW5rcyBhcmUgdXNlZCBpbiBYQlJMIHRvIGNyZWF0ZSByZWxhdGlvbnMgYmV0d2VlbiBhbmQgYW1vbmcgY29uY2VwdHMgaW4gb3JkZXIgdG8gZ2l2ZSBtZWFuaW5nIHRvIG90aGVyd2lzZSBzY2F0dGVyZWQgZGF0YS4gSW4gWEJSTCBsaW5rcyBhcmUgb3JnYW5pemVkIGJ5IHR5cGUgKHByZXNlbnRhdGlvbiwgY2FsY3VsYXRpb24sIGRlZmluaXRpb24sIGxhYmVsLCBmb3JtdWxhLCB0YWJsZSwgLi4uKS4gV2l0aGluIGVhY2ggdHlwZSBsaW5rcyBhcmUgZnVydGhlciBwYXJ0aXRpb25lZCBpbnRvIGBuZXR3b3JrcyBvZiByZWxhdGlvbnNoaXBzYCB1c2luZyBgRXh0ZW5kZWQgTGluayBSb2xlc2AsIGZvciBleGFtcGxlIGluIGEgcHJlc2VudGF0aW9uIGxpbmssIGFuIGV4dGVuZGVkIGxpbmsgcm9sZSBtYXkgYmUgZGVmaW5lZCBmb3IgQmFsYW5jZSBTaGVldCB0byBncm91cCB0b2dldGhlciByZWxhdGlvbnNoaXBzIGZvciBCYWxhbmNlIFNoZWV0IHByZXNlbnRhdGlvbiBhbm90aGVyIGV4dGVuZGVkIGxpbmsgcm9sZSBtYXkgYmUgZGVmaW5lZCBmb3IgSW5jb21lIFN0YXRlbWVudCB0byBncm91cCB0b2dldGhlciByZWxhdGlvbnNoaXBzIGZvciBJbmNvbWUgU3RhdGVtZW50IHByZXNlbnRhdGlvbnMgYW5kIHNvIG9uLiBTYW1lIGBFeHRlbmRlZCBsaW5rIHJvbGVgIGNhbiBiZSB1c2VkIGFzIHRoZSBoZWFkIG9mIGEgbmV0d29yayBvZiByZWxhdGlvbnMgYWNyb3NzIG11bHRpcGxlIGxpbmsgdHlwZXMsIGZvciBleGFtcGxlLCBhbiBleHRlbmRlZCBsaW5rIHJvbGUgbWF5IGJlIGNyZWF0ZWQgdG8gZ3JvdXAgYmFsYW5jZSBzaGVldCBuZXR3b3JrIG9mIHJlbGF0aW9ucyBhbmQgY2FuIGJlIHVzZWQgd2l0aGluIHByZXNlbnRhdGlvbiwgY2FsY3VsYXRpb24gYW5kIGRlZmluaXRpb24gbGlua3MuDQoNClRoZSBuZXR3b3JrcyBvZiByZWxhdGlvbnMgKGdyb3VwZWQgYnkgZXh0ZW5kZWQgbGluayByb2xlcykgdG9nZXRoZXIgY2FsbGVkIGEgYGxpbmtiYXNlYCwgaGVuY2UgdGhlIGBiYXNlYCBpbiBsaW5rYmFzZSAoUHJlc2VudGF0aW9uIGxpbmtiYXNlLCBDYWxjdWxhdGlvbiBsaW5rYmFzZSwgLi4uKSwgYWxzbyBsaW5rYmFzZXMgY2FuIGJlIHN0b3JlZCBhY3Jvc3MgbXVsdGlwbGUgZmlsZXMgb3IgYSBzaW5nbGUgZmlsZSBkZXBlbmRpbmcgb24gdGhlIG92ZXJhbGwgb3JnYW5pemF0aW9uIG9mIHRoZSB0YXhvbm9teS4gVGhpcyBzZXR1cCBjYW4gYmUgdmlzdWFsaXplZCBhcyBmb2xsb3dzOiAgDQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtMaW5rYmFzZSBPdmVydmlld10oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMvbGlua3NPdmVyVmlldy5wbmcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKkxpbmtiYXNlIE92ZXJ2aWV3ICoqW18oZmlndXJlIGNyZWF0ZWQgdXNpbmcgZHJhdy5pbylfXShodHRwczovL2FwcC5kaWFncmFtcy5uZXQvKQ0KPC9wPg0KPC9kaXY+DQoNCioqX0xpbmtzIFVzYWdlIGluIFhCUkxfKiogIA0KTGlua2Jhc2VzIGFyZSBjcmVhdGVkIGluIGAueG1sYCBmaWxlcywgYW5kIHJlZmVyZW5jZWQgaW4gdGhlIFhCUkwgdGF4b25vbXkgc2NoZW1hIHVzaW5nIFhCUkwgbGlua2Jhc2UgZWxlbWVudCBge2h0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9saW5rYmFzZX1yb2xlVHlwZWAsIHRoZW4gaW4gdGhlIGxpbmtiYXNlIGZpbGUsIHRoaXMgYHJvbGVUeXBlYCBpcyByZWZlcmVuY2VkIGJhY2sgdG8gdGhlIHNjaGVtYSB1c2luZyBlbGVtZW50IGB7aHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2xpbmtiYXNlfXJvbGVSZWZgIHdoaWNoIGlzIGFjY2Vzc2VkIGJ5IGxpbmsgY29uc3RydWN0b3IgIHRvIGNyZWF0ZSB0aGUgbmV0d29yayBvZiByZWxhdGlvbnMgZm9yIHRoaXMgbGluayBSb2xlLCBhcyBzaG93biBpbiB0aGUgZmlndXJlIGJlbG93LiAgDQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtMaW5rYmFzZSBTY2hlbWEgcmVmZXJlbmNlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9saW5rYmFzZS5wbmcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKkxpbmtiYXNlIFNjaGVtYSByZWZlcmVuY2UgKipbXyhmaWd1cmUgY3JlYXRlZCB1c2luZyBkcmF3LmlvKV9dKGh0dHBzOi8vYXBwLmRpYWdyYW1zLm5ldC8pDQo8L3A+DQo8L2Rpdj4gIA0KDQpSb290IGVsZW1lbnQgb2YgYSBsaW5rYmFzZSBmaWxlIGlzIGA8bGlua2Jhc2U+YCBuYW1lc3BhY2UgYGh0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9saW5rYmFzZWAsIHRoZSBhbGxvd2VkIGNoaWxkcmVuIGZvciBgPGxpbmtiYXNlPmAgYXJlOiAgDQoNCjxkaXY+DQo8Y2VudGVyIGlkPSJsaW5rYmFzZS1lbGVtZW50LWltZyI+DQohW2xpbmtiYXNlIGVsZW1lbnRdKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL2xpbmtiYXNlRWxlbWVudC5qcGcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKmxpbmtiYXNlIGVsZW1lbnQqKg0KPC9wPg0KPC9kaXY+DQoNCiogYDxkb2N1bWVudGF0aW9uPmA6IERvY3VtZW50YXRpb24gZm9yIHRoZSBsaW5rYmFzZQ0KKiBgPHJvbGVSZWY+YCA6IFJlZmVyZW5jZSB0aGUgbGlua3JvbGVzIGRlY2xhcmVkIGluIHNjaGVtYSAoc2VlIFtyb2xlVHlwZXNdKCNyb2xlLXR5cGVzKSkuICANCiogYDxhcmNyb2xlUmVkPmA6IFJlZmVyZW5jZSB0aGUgYXJjcm9sZXMgZGVjbGFyZWQgaW4gc2NoZW1hIGlmIGFueSAobm9uZSBpbiB0aGlzIGV4YW1wbGUpLiAgDQoqIGA8ZXh0ZW5kZWQ+YDogRWxlbWVudCBpbiBzdWJzdGl0dXRpb24gZ3JvdXAgYGV4dGVuZGVkYCB3aXRoIGJhc2UgdHlwZSBgZXh0ZW5kZWRUeXBlYCwgc3VjaCBhcyBgPHByZXNlbnRhdGlvbkxpbms+YCwgYDxjYWxjdWxhdGlvbkxpbms+YCwgLi4uIA0KDQoqKk5vdGUqKiAgDQpYQlJMIGRlZmluZXMgb25lIHN0YW5kYXJkIGxpbmtSb2xlIGBodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvcm9sZS9saW5rYCBhbmQgaXQgaXMgdXNlZCBhcyBkZWZhdWx0Lg0KDQpUaGUgbGluayByb2xlIChuZXR3b3JrIG9mIHJlbGF0aW9ucykgaXMgZGVmaW5lZCB1c2luZyB0aGUgZWxlbWVudHMgYmFzZWQgb24gdGhlIGBleHRlbmRlZGAgdHlwZSBhcyB0aGUgY29udGFpbmVyIGZvciB0aGUgdGhlIHJlbGF0aW9uc2hpcHMsIHRoZW4gY29uY2VwdHMgcGFydGljaXBhdGluZyBpbiB0aGUgbmV0d29yayBhcmUgZmlyc3QgbG9jYXRlZCB1c2luZyB0aGUgYDxsaW5rOmxvYz5gIGVsZW1lbnQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IG9yIHJlc291cmNlIHVzaW5nIFhMaW5rIGFuZCBYUG9pbnRlciBzeW50YXguIFRoZW4gdGhlIGRlc2lyZWQgcmVsYXRpb24gaXMgZXN0YWJsaXNoZWQgYmV0d2VlbiBsb2NhdG9ycyAoYXMgcHJveHkgZm9yIHRoZSB0YXJnZXQgY29uY2VwdCBvciByZXNvdXJjZSkgdXNpbmcgdGhlIHJlbGV2YW50IGBhcmMgdHlwZWAsIGZvciBleGFtcGxlIGEgcHJlc2VudGF0aW9uIGxpbmsgd2lsbCB1c2UgYGxpbms6cHJlc2VudGF0aW9uQXJjYCBlbGVtZW50IHRvIGVzdGFibGlzaCB0aGUgcmVsYXRpb24gYmV0d2VlbiBsb2NhdG9ycy4gIA0KPGRpdj4NCjxjZW50ZXI+DQohW0xpbmtiYXNlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9saW5rcy5wbmcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKkxpbmtiYXNlICoqW18oZmlndXJlIGNyZWF0ZWQgdXNpbmcgZHJhdy5pbylfXShodHRwczovL2FwcC5kaWFncmFtcy5uZXQvKQ0KPC9wPg0KPC9kaXY+DQoNClRoZSByZWxhdGlvbnNoaXBzIHdpdGhpbiBhIGxpbmsgcm9sZSAoYWxzbyByZWZlcnJlZCB0byBhcyBuZXR3b3JrcykgaW4gY2FzZSBvZiAqKk5vbmUqKiByZXNvdXJjZSBsaW5rcyAgYXJlIGluIGhpZXJhcmNoaWNhbCB0cmVlIGZvcm0gd2l0aCBvbmUgcm9vdCB0aGF0IGhhcyBicmFuY2hlcywgYW5kIHRoZW4gZWFjaCBicmFuY2ggbWF5IGJlIHRoZSByb290IHRvIG90aGVyIGJyYW5jaGVzLCBhbmQgc28gb24gdW50aWwgdGhlIGxlYWYgbGV2ZWwuDQoNCiMjIyBFeGFtcGxlIC0gIEluY29tZSBTdGF0ZW1lbnQgVGF4b25vbXkgYW5kIExpbmtiYXNlcyAgDQpJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCBjcmVhdGUgdGF4b25vbXkgYW5kIGxpbmtiYXNlcyBmb3IgYSBzaW1wbGUgSW5jb21lIFN0YXRlbWVudC4NCg0KIyMjIyBGb3JtICAgDQpXZSB3YW50IHRvIGNyZWF0ZSB0YXhvbm9teSBhbmQgbGlua3MgZm9yIGEgYEluY29tZSBTdGF0ZW1lbnRgIHRoYXQgbG9va3MgYXMgZm9sbG93czogIA0KDQpgYGB7ciBleGFtcGxlX2lzLCBlY2hvPUZBTFNFLCAgd2FybmluZz1GQUxTRSwgZmlnLmNhcD0nRXhhbXBsZSBJbmNvbWUgU3RhdGVtZW50J30NCg0KZGZfaXMgPC0gZGF0YS5mcmFtZSgNCiAgYT0gYygnUmV2ZW51ZScsICdQcm9kdWN0JywgJ1NlcnZpY2UnLA0KICAgICAgICdUb3RhbCBSZXZlbnVlJywnIENvc3Qgb2YgUmV2ZW51ZScsICdQcm9kdWN0JywNCiAgICAgICAnU2VydmljZScsICdUb3RhbCBDb3N0IG9mIFJldmVudWUnLCAnR3Jvc3MgUHJvZml0JywgDQogICAgICAgJ0V4cGVuc2VzJywgJ05ldCBQcm9maXQnKSwNCiAgYiA9IGMoJycsICcyLDAwMCcsJzMsMDAwJywnNSwwMDAnLCcnLCAnMSwwMDAnLCAnMiwwMDAnLCAnMywwMDAnLCAnMiwwMDAnLCAnNTAwJywgJzEsNTAwJyksDQogIGMgPSBjKCcnLCAnMiw1MDAnLCcxLDUwMCcsJzQsMDAwJywnJywgJzEsMjUwJywgJzEsMDAwJywgJzIsMjUwJywgJzEsNzUwJywgJzQyMCcsICcxLDMzMCcpDQopDQoNCnRibCA8LSBrbml0cjo6a2FibGUoZGZfaXMsICdodG1sJywgDQogICAgICAgICAgY29sLm5hbWVzID0gYygnKEluIEVHUCknLCAnMzEtMTItMjAyMCcsICczMS0xMi0yMDE5JyksIGFsaWduPWMoJ2wnLCAncicsICdyJykpICU+JSANCiAga2FibGVFeHRyYTo6cm93X3NwZWMoYygxLDUpLCBib2xkID0gVFJVRSkgJT4lICANCiAga2FibGVFeHRyYTo6cm93X3NwZWMoYyg0LDgpLCBleHRyYV9jc3MgPSAiYm9yZGVyLXRvcDogMXB4IHNvbGlkOw0KICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQiLCBib2xkID0gVFJVRSkgJT4lICANCiAga2FibGVFeHRyYTo6cm93X3NwZWMoOSwgZXh0cmFfY3NzID0gImJvcmRlci10b3A6IDFweCBzb2xpZCIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlRXh0cmE6OnJvd19zcGVjKDExLCBleHRyYV9jc3MgPSAiYm9yZGVyLXRvcDogMXB4IHNvbGlkOw0KICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAzcHggZG91YmxlIiwgYm9sZCA9IFRSVUUpICU+JQ0KICBrYWJsZUV4dHJhOjphZGRfaW5kZW50KGMoMiwzLDYsNykpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGKSAlPiUgDQogIGthYmxlRXh0cmE6OmFkZF9oZWFkZXJfYWJvdmUoYygnJywgICdZZWFyIEVuZGVkJz0yKSkNCnRibA0KDQpgYGANCiMjIyMgVGF4b25vbXkgIA0KRmlyc3Qgd2UgY3JlYXRlIG91ciBzY2hlbWEvdGF4b25vbXkgYXMgZm9sbG93czogIA0KYGBge3IgaXNfZXhhbXBsZV9zY2hlbWEsIGVjaG89RkFMU0V9DQpmbl9Db2RlQ2h1bmtPdXQobGFuZz0neG1sJywgRmlsZSA9IGhlcmU6OmhlcmUoJ3htbF9maWxlcy9pbmNvbWVTdGF0ZW1lbnRFeGFtcGxlJywnaXMueHNkJykpDQpgYGANCg0KTm90ZSB0aGF0IHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSBlbnRyeSBwb2ludCBvZiBvdXIgdGF4b25vbXkgaXMgYDxzY2hlbWE+YCBhcyBhbnkgWE1MIHNjaGVtYSBkb2N1bWVudC4gIA0KDQoqKlRoZSBzY2hlbWEvdGF4b25vbXkgZG9jdW1lbnQgcmVsZXZhbnQgY29tcG9uZW50cyBjYW4gYmUgYW5hbHl6ZWQgYXMgZm9sbG93czoqKiAgDQoNCiMjIyMjIEltcG9ydHMNCl9JbXBvcnRpbmcgb3RoZXIgc2NoZW1hcyBhbmQgdGF4b25vbWllcyB0byBiZSB1c2VkIGluIG91ciB0YXhvbm9teSB1c2luZyBgPGltcG9ydD5gIGVsZW1lbnQgYXMgZm9sbG93czpfICANCmBgYHtyIGlzX3hzZF9pbXBvcnRzLCBlY2hvPUZBTFNFfQ0KaXNfeHNkIDwtIHhtbDI6OnJlYWRfeG1sKGhlcmU6OmhlcmUoJ3htbF9maWxlcy9pbmNvbWVTdGF0ZW1lbnRFeGFtcGxlJywnaXMueHNkJykpDQoNCmltcG9ydHMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKGlzX3hzZCwnLi8vKltsb2NhbC1uYW1lKCk9ImltcG9ydCJdJykgJT4lDQogIG1hcChmdW5jdGlvbih4KSB7DQogICAgYyh0YWc9eG1sMjo6eG1sX25hbWUoeCksIHhtbDI6OnhtbF9hdHRycyh4KSkNCiAgfSkgJT4lIGJpbmRfcm93cygpICU+JSBtdXRhdGUoZGVzY3JpcHRpb249YygNCiAgICAnSW1wb3J0cyBiYXNlIFhCUkwgaW5zdGFuY2UgdHlwZXMnLCAnSW1wb3J0cyBub25OdW1lcmljIHR5cGVzJywgJ0ltcG9ydHMgWEJSTCBEaW1lbnNpb25zJywgJ0ltcG9ydHMgZGF0YSB0eXBlIHJlZ2lzdHJ5Jw0KICApKQ0KDQprbml0cjo6a2FibGUoaW1wb3J0cykgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKQ0KYGBgDQoNCg0KV2l0aGluIGA8YW5ub3RhdGlvbj5gIHNjaGVtYSBlbGVtZW50IHdlIGNhbiBhZGQgZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nIHRoZSBkb2N1bWVudCBpbiBhZGRpdGlvbiB0byBzb21lIGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgYnkgdGhlIHByb2Nlc3NvciB0aHJvdWdoIHRoZSBgPGFwcGluZm8+YCwgdGhlc2UgaW5mb3JtYXRpb24gaW5jbHVkZXMgYnV0IG5vdCBsaW1pdGVkIHRvOyBkZWZpbmluZyBleHRlbmRlZCBsaW5rIHJvbGVzIGFuZCBsaW5rYmFzZSByZWZlcmVuY2VzIChyZWZlcmVuY2VzIHRvIGxpbmtiYXNlIGZpbGVzKS4gDQoNCiMjIyMjIFJvbGUgVHlwZXN7I3JvbGUtdHlwZXN9ICANCl9EZWZpbmluZyBFeHRlbmRlZCBMaW5rUm9sZXMgdXNpbmcgYDxyb2xlVHlwZT5gIGVsZW1lbnQgYXMgaW4gb3VyIGV4YW1wbGUgYXMgZm9sbG93czpfICANClRoZSBgZXh0ZW5kZWQgbGluayByb2xlYCBmb3IgdGhlIGBpbmNvbWUgU3RhdGVtZW50YCBoYXMgVVJJIDx1PioqYGh0dHA6Ly94eXouYWJjL3JvbGUvSW5jb21lU3RhdGVtZW50YCoqPC91PiBhbmQgY2FuIGJlIHVzZWQgb24gYHByZXNlbnRhdGlvbmAsIGBjYWxjdWxhdGlvbmAgYW5kIGBkZWZpbml0aW9uYCBsaW5rczogIA0KYGBge3IgaXNfZXhhbXBsZV9saW5rcm9sZSwgZWNobz1GQUxTRX0NCmZuX0NvZGVDaHVua091dChsYW5nID0gJ3htbCcsIHR4dCA9IA0KJzxsaW5rOnJvbGVUeXBlIGlkPSJyb2xlVHlwZV9JbmNvbWVTdGF0ZW1lbnQiIHJvbGVVUkk9Imh0dHA6Ly94eXouYWJjL3JvbGUvSW5jb21lU3RhdGVtZW50Ij4NCiAgICA8bGluazpkZWZpbml0aW9uPjEwMDAwIC0gU3RhdGVtZW50IC0gSW5jb21lIFN0YXRlbWVudDwvbGluazpkZWZpbml0aW9uPg0KICAgICAgICAgICAgICAgIDxsaW5rOnVzZWRPbj5saW5rOmNhbGN1bGF0aW9uTGluazwvbGluazp1c2VkT24+DQogICAgICAgICAgICAgICAgPGxpbms6dXNlZE9uPmxpbms6ZGVmaW5pdGlvbkxpbms8L2xpbms6dXNlZE9uPg0KICAgICAgICAgICAgICAgIDxsaW5rOnVzZWRPbj5saW5rOnByZXNlbnRhdGlvbkxpbms8L2xpbms6dXNlZE9uPg0KPC9saW5rOnJvbGVUeXBlPicpDQpgYGANCl9Ob3RlXyB0aGUgZXh0ZW5kZWQgbGluayByb2xlIG5lZWRzIHRvIGhhdmUgYSB1bmlxdWUgYEBpZGAgYW5kIGBAcm9sZVVSSWAgYXR0cmlidXRlcy4gIA0KDQojIyMjIyBMaW5rYmFzZXMgcmVmZXJlbmNlcw0KX0xpbmtpbmcgdG8gTGlua2Jhc2VzIGZpbGVzIHVzaW5nIGA8bGlua2Jhc2VSZWY+YCBlbGVtZW50IGFzIGluIG91ciBleGFtcGxlIGFzIGZvbGxvd3M6XyAgDQpgYGB7ciBpc194c2RfbGlua2Jhc2VSZWYsIGVjaG89RkFMU0V9DQpsaW5rYmFzZVJlZnMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKGlzX3hzZCwnLi8vKltsb2NhbC1uYW1lKCk9ImxpbmtiYXNlUmVmIl0nKSAlPiUNCiAgbWFwKGZ1bmN0aW9uKHgpIHsNCiAgICBjKHRhZz14bWwyOjp4bWxfbmFtZSh4KSwgeG1sMjo6eG1sX2F0dHJzKHgpKQ0KICB9KSAlPiUgYmluZF9yb3dzKCkgJT4lIG11dGF0ZShkZXNjcmlwdGlvbj1jKCdUYWJsZSBMaW5rYmFzZScsJ0Zyb211bGEgTGlua2Jhc2UgKGZvciB2YWxpZGF0aW9uKScsDQogICAgJ0VuZ2xpc2ggTGFiZWxzIGxpbmtiYXNlJywgJ0FyYWJpYyBMYWJlbHMgbGlua2Jhc2UnLCAnUHJlc2VudGF0aW9uIGxpbmtiYXNlJywgDQogICAgJ0RlZmluaXRpb24gbGlua2Jhc2UgKERpbWVuc2lvbnMpJywgJ0NhbGN1bGF0aW9uIGxpbmtiYXNlJywgJ0FyYWJpYyBFTFIgZGVmaW5pdGlvbicpLA0KICBhcmNyb2xlPSBwYXN0ZTAoJ2h0dHA6Ly8uLi4vJywgYmFzZW5hbWUoYXJjcm9sZSkpLA0KICByb2xlPSBwYXN0ZTAoJ2h0dHA6Ly8uLi4vJywgYmFzZW5hbWUocm9sZSkpDQogIA0KICApDQoNCmswIDwtIGtuaXRyOjprYWJsZShsaW5rYmFzZVJlZnMpICU+JSBrYWJsZUV4dHJhOjprYWJsZV9jbGFzc2ljKCkNCg0KaHRtbHRvb2xzOjpkaXYoaHRtbHRvb2xzOjpIVE1MKGswKSwgc3R5bGU9Im92ZXJmbG93LXg6YXV0byIpDQpgYGANCjwvYnI+DQoNCiMjIyMjIFRheG9ub215IGVsZW1lbnRzL3ZvY2FidWxhcnk6ICANClRoZSBgPGVsZW1lbnQ+YCB0YWcgaXMgdXNlZCB0byBkZWZpbmUgY29uY2VwdHMsIGVpdGhlciBjb25jZXB0IGNvcmUgZGltZW5zaW9ucyBvciB0YXhvbm9teSBkZWZpbmVkIGRpbWVuc2lvbnMgYXMgZm9sbG93czogIA0KYGBge3IgaXNfeHNkX2VsZW1lbnRzLCBlY2hvPUZBTFNFfQ0KZWxlbWVudHMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKGlzX3hzZCwnLi8vKltsb2NhbC1uYW1lKCk9ImVsZW1lbnQiXScpICU+JQ0KICBtYXAoZnVuY3Rpb24oeCkgew0KICAgIGModGFnPXhtbDI6OnhtbF9uYW1lKHgpLCB4bWwyOjp4bWxfYXR0cnMoeCkpDQogIH0pICU+JSBiaW5kX3Jvd3MoKSAlPiUgYXJyYW5nZShhYnN0cmFjdCkNCnRydWVSb3dzIDwtIHdoaWNoKGlmX2Vsc2UoZWxlbWVudHMkYWJzdHJhY3Q9PSd0cnVlJywgVFJVRSwgRkFMU0UpKQ0KZmFsc2VSb3dzIDwtIHdoaWNoKGlmX2Vsc2UoZWxlbWVudHMkYWJzdHJhY3Q9PSdmYWxzZScsIFRSVUUsIEZBTFNFKSkNCmsgPC0gIGtuaXRyOjprYWJsZShlbGVtZW50cykgJT4lIA0KICBrYWJsZUV4dHJhOjpwYWNrX3Jvd3MoJ0NvbmNlcHQgQ29yZSBEaW1lbnNpb25zJywgZmFsc2VSb3dzWzFdLCBmYWxzZVJvd3NbbGVuZ3RoKGZhbHNlUm93cyldLGxhYmVsX3Jvd19jc3MgPSAiZm9udC1zdHlsZTogaXRhbGljO2JvcmRlci1ib3R0b206IDFweCBzb2xpZDsiKSAlPiUNCiAgICBrYWJsZUV4dHJhOjpwYWNrX3Jvd3MoJ1RheG9ub215IERlZmluZWQgRGltZW5zaW9ucycsIHRydWVSb3dzWzFdLCB0cnVlUm93c1tsZW5ndGgodHJ1ZVJvd3MpXSxsYWJlbF9yb3dfY3NzID0gImZvbnQtc3R5bGU6IGl0YWxpYztib3JkZXItYm90dG9tOiAxcHggc29saWQ7IikgJT4lIA0KICBrYWJsZUV4dHJhOjprYWJsZV9jbGFzc2ljKCkgDQpodG1sdG9vbHM6OmRpdihodG1sdG9vbHM6OkhUTUwoayksIHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iKQ0KYGBgDQo8L2JyPg0KDQojIyMjIFByZXNlbnRhdGlvbiBsaW5rYmFzZSAgDQpQcmVzZW50YXRpb24gbGlua2Jhc2UgaXMgdXNlZCB0byBkZWZpbmUgY29uY2VwdHMgcmVsYXRpb25zaGlwcyBpbiB0ZXJtcyBvZiBwcmVzZW50YXRpb24gYW5kIHJlbmRlcmluZywgaW4gb3RoZXIgd29yZHMgaXQgb3JnYW5pemVzIGNvbmNlcHRzIGJ5IGRlZmluaW5nIHRoZSBvcmRlciBhbmQgZ3JvdXBpbmcgb2YgY29uY2VwdHMgd2l0aGluIHRoZSB0YXhvbm9teSwgYWxzbyBpdCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYSB0YXhvbm9teSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4gDQoNClByZXNlbnRhdGlvbiBsaW5rYmFzZSBYTUwgZmlsZTogIA0KYGBge3IgaXNfZXhhbXBsZV9wcmVfbGluaywgZWNobz1GQUxTRX0NCmZuX0NvZGVDaHVua091dChsYW5nPSd4bWwnLCBGaWxlID0gaGVyZTo6aGVyZSgneG1sX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUnLCdpc19wcmUueG1sJykpDQpgYGANCiAgDQpOb3RlIHRoYXQgdGhlIHJvb3QgZWxlbWVudCBpcyBgPGxpbmtiYXNlPmAsIHdoaWNoIGNhbiBoYXZlIG9ubHkgZm91ciB0eXBlcyBvZiBjaGlsZHJlbiBlbGVtZW50cyAoc2VlIFtsaW5rYmFzZSBlbGVtZW50XSgjbGlua2Jhc2UtZWxlbWVudC1pbWcpKQ0KDQoqKlRoZSBwcmVzZW50YXRpb24gbGlua2Jhc2UgcmVsZXZhbnQgY29tcG9uZW50cyBjYW4gYmUgYW5hbHl6ZWQgYXMgZm9sbG93czoqKiAgDQoNCiMjIyMjIHJvbGVSZWYgIA0KRWxlbWVudCBgPHJvbGVSZWY+YCByZWZlcmVuY2VzIHRoZSBgPHJvbGVUeXBlPmAgZGVjbGFyYXRpb24gaW4gdGhlIHNjaGVtYSBhbmQgaXMgcmVwZWF0ZWQgZm9yIGVhY2ggYHJvbGVUeXBlYCBkZWNsYXJlZCwgZm9sbG93aW5nIGlzIHRoZSBgcm9sZVJlZmBgIGZyb20gb3VyIGV4YW1wbGU6ICANCmBgYHtyIGlzX3ByZV9yb2xlVHlwZSwgZWNobz1GQUxTRX0NCmlzX3ByZSA8LSB4bWwyOjpyZWFkX3htbChoZXJlOjpoZXJlKCd4bWxfZmlsZXMvaW5jb21lU3RhdGVtZW50RXhhbXBsZScsJ2lzX3ByZS54bWwnKSkNCg0Kcm9sZVJlZiA8LSB4bWwyOjp4bWxfZmluZF9hbGwoaXNfcHJlLCcuLy8qW2xvY2FsLW5hbWUoKT0icm9sZVJlZiJdJykgJT4lDQogIG1hcChmdW5jdGlvbih4KSB7DQogICAgYyh0YWc9eG1sMjo6eG1sX25hbWUoeCksIHhtbDI6OnhtbF9hdHRycyh4KSkNCiAgfSkgJT4lIGJpbmRfcm93cygpICU+JSBtdXRhdGUoZGVzY3JpcHRpb249YyhrYWJsZUV4dHJhOjp0ZXh0X3NwZWMoJ1NlZSByb2xlVHlwZScsIGxpbmsgPSAnI3JvbGUtdHlwZXMnKSkpDQoNCmsxMSA8LSBrbml0cjo6a2FibGUocm9sZVJlZiwgZXNjYXBlID0gRikgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKQ0KaHRtbHRvb2xzOjpkaXYoaHRtbHRvb2xzOjpIVE1MKGsxMSksIHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iKQ0KYGBgDQojIyMjIyBSZWxhdGlvbnMgKGFyY3MpICANCkFzIG1lbnRpb25lZCB0aGUgbmV0d29yayBvZiByZWxhdGlvbnMgaXMgYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgcm9vdCwgaW4gb3VyIGNhc2UgZm9yIGxpbmtyb2xlIGBodHRwOi8veHl6LmFiYy9yb2xlL0luY29tZVN0YXRlbWVudGAgdGhlIHJvb3QgZWxlbWVudCBpcyBgSW5jb21lIFN0YXRlbWVudCBbQWJzdHJhY3RdYCB0aGF0IGlzIG1lYW50IHRvIGdyb3VwIHRvZ2V0aGVyIGFsbCBJbmNvbWUgc3RhdGVtZW50IGVsZW1lbnRzLCB0aGUgbmV0d29yayBjYW4gYmUgZGVzY3JpYmVkIGluIGEgdGFibGUgYXMgZm9sbG93cyAoYEBmcm9tYCBhbmQgYEB0b2AgcmVmZXJzIHRvIGxvY2F0b3JzIGlkcyk6ICANCmBgYHtyIGlzX3ByZV9uZXR3b3JrLCBlY2hvPUZBTFNFfQ0KbmV0d29yayA8LSB4bWwyOjp4bWxfZmluZF9hbGwoaXNfcHJlLCcuLy8qW2xvY2FsLW5hbWUoKT0icHJlc2VudGF0aW9uQXJjIl0nKSAlPiUNCiAgbWFwKGZ1bmN0aW9uKHgpIHsNCiAgICBjKHRhZz14bWwyOjp4bWxfbmFtZSh4KSwgeG1sMjo6eG1sX2F0dHJzKHgpKQ0KICB9KSAlPiUgYmluZF9yb3dzKCkgJT4lIGFycmFuZ2UoZnJvbSwgb3JkZXIpDQoNCmtuaXRyOjprYWJsZShuZXR3b3JrLCBlc2NhcGUgPSBGKSAlPiUga2FibGVFeHRyYTo6a2FibGVfY2xhc3NpYygpICU+JSANCiAgaHRtbHRvb2xzOjpIVE1MKCkgJT4lIGh0bWx0b29sczo6ZGl2KHN0eWxlPSJvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6IG5vd3JhcDsiKQ0KYGBgDQoNCl9Ob3Rlc18gIA0KDQoqIGA8cHJlc2VudGF0aW9uQXJjPmAgaXMgdXNlZCB0byBlc3RhYmxpc2ggcHJlc2VudGF0aW9uIHJlbGF0aW9uc2hpcHMgaW4gYSBwcmVzZW50YXRpb24gbmV0d29yay4gIA0KKiBgcGFyZW50LWNoaWxkYCBhcmNyb2xlIGlzIHVzZWQgZm9yIHByZXNlbnRhdGlvbiByZWxhdGlvbnNoaXAgIA0KKiBgQHByZWZlcnJlZExhYmVsYCBpcyB1c2VkIG9uIGBwcmVzZW50YXRpb25BcmNgIHRvIGRldGVybWluZSB3aGljaCBsYWJlbCByb2xlIHRvIGRpc3BsYXkgKHNlZSBsYWJlbCBsaW5rYmFzZSkgIA0KKiBgQG9yZGVyYCBpcyB1c2VkIG9uIGBwcmVzZW50YXRpb25BcmNgIHRvIGRldGVybWluZSB0aGUgb3JkZXIgb2YgYXBwZWFyYW5jZSBvZiBjb25jZXB0IHdoZW4gcHJlc2VudGVkLiAgDQoNCiMjIyMjIEhpZXJhcmNoaWNhbCBWaWV3ICANCioqQSBoaWVyYXJjaGljYWwgdmlldyBvZiBwcmVzZW50YXRpb24gbGluayAoQ29uY2VwdHMgbGFiZWxzIGFyZSB1c2VkKSoqOiANCmBgYHtyIGlzX3ByZV9uZXR3b3JrX2hpZXIsIGVjaG89RkFMU0V9DQpkYXRhLmZyYW1lKGBDb25jZXB0IExhYmVsYD0gYygNCicxMDAwMCAtIFN0YXRlbWVudCAtIEluY29tZSBTdGF0ZW1lbnQnLA0KJ0luY29tZSBTdGF0ZW1lbnQgW0Fic3RyYWN0XScsDQonSW5jb21lIFN0YXRlbWVudCBbVGFibGVdJywNCidQcm9kdWN0IEFuZCBTZXJ2aWNlIFtBeGlzXScsDQonUHJvZHVjdCBBbmQgU2VydmljZSBbRG9tYWluXScsDQonUHJvZHVjdCBbTWVtYmVyXScsDQonU2VydmljZSBbTWVtYmVyXScsDQonU3RhdGVtZW50IFtMaW5lIEl0ZW1zXScsDQonVG90YWwgUmV2ZW51ZXMnLA0KJ1RvdGFsIENvc3RzIG9mIFJldmVudWVzJywNCidHcm9zcyBQcm9maXQnLA0KJ0V4cGVuc2VzJywNCidOZXQgUHJvZml0JywNCidFYXJuaW5ncyBQZXIgU2hhcmUnLA0KJ1NoYXJlcyBPdXRzdGFuZGluZycpLA0Kb3JkZXI9YygnJywxLDEsMSwxLDEsMiwyLDEsMiwzLDQsNSw2LDcpLA0KZGVwdGg9YygnQ29udGFpbmVyJywnUm9vdCcsJzInLCczJywnNCcsJzUnLCc1JywnMycsJzQnLCc0JywnNCcsJzQnLCc0JywnNCcsJzQnKSkgJT4lIGtuaXRyOjprYWJsZShjb2wubmFtZXMgPSBjKHBhc3RlMCgnQ29uY2VwdCBMYWJlbCcsIGthYmxlRXh0cmE6OmZvb3Rub3RlX21hcmtlcl9zeW1ib2woMSkpLCdPcmRlciB3aXRoaW4gR3JvdXAnLCAnZGVwdGgnKSwgYWxpZ24gPSBjKCdsJywgJ2MnLCAncicpLCBlc2NhcGUgPSBGKSAlPiUga2FibGVFeHRyYTo6a2FibGVfY2xhc3NpYygpICU+JSANCiAga2FibGVFeHRyYTo6YWRkX2luZGVudChwb3NpdGlvbnMgPSAyLCBsZXZlbF9vZl9pbmRlbnQgPTEgKSAlPiUgDQogIGthYmxlRXh0cmE6OmFkZF9pbmRlbnQocG9zaXRpb25zID0gMywgbGV2ZWxfb2ZfaW5kZW50ID0yICkgJT4lIA0KICBrYWJsZUV4dHJhOjphZGRfaW5kZW50KHBvc2l0aW9ucyA9IGMoNCw4KSwgbGV2ZWxfb2ZfaW5kZW50ID0zICkgJT4lIA0KICBrYWJsZUV4dHJhOjphZGRfaW5kZW50KHBvc2l0aW9ucyA9IGMoNSw5OjE1KSwgbGV2ZWxfb2ZfaW5kZW50ID00KSAlPiUgDQogIGthYmxlRXh0cmE6OmFkZF9pbmRlbnQocG9zaXRpb25zID0gYyg2LDcpLCBsZXZlbF9vZl9pbmRlbnQgPTUpICU+JSANCiAga2FibGVFeHRyYTo6Zm9vdG5vdGUoc3ltYm9sPSJDb25jZXB0cyBwcmVmZXJyZWQgbGFiZWxzIGFyZSB1c2VkIGluIHRoaXMgdGFibGUiKQ0KDQoNCmBgYA0KDQoNCioqQSBsb2dpY2FsIHZpZXcgb2YgdGhlIHByZXNlbnRhdGlvbiBsaW5rIHJvbGUgd2lsbCBiZSBhcyBmb2xsb3dzOioqDQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtQcmVzZW50YXRpb24gTGluayBEaWFncmFtXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9wcmVzZW50YXRpb25saW5rLnBuZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqUHJlc2VudGF0aW9uIExpbmsgRGlhZ3JhbSAqKltfKGZpZ3VyZSBjcmVhdGVkIHVzaW5nIGRyYXcuaW8pX10oaHR0cHM6Ly9hcHAuZGlhZ3JhbXMubmV0LykNCjwvcD4NCjwvZGl2PiAgDQoNCiMjIyMgQ2FsY3VsYXRpb24gbGlua2Jhc2UgIA0KQ2FsY3VsYXRpb24gbGlua2Jhc2UgaXMgdXNlZCB0byBkZXNjcmliZSBjYWxjdWxhdGlvbiByZWxhdGlvbnNoaXBzIGJldHdlZW4gY29uY2VwdHMgaW4gdGVybXMgb2YgdG90YWxzIGFuZCBzdWJ0b3RhbHMsIGl0IGlzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCBYQlJMIGl0c2VsZiBkb2VzIG5vdCBkbyBhbnkgY2FsY3VsYXRpb25zLCBpdCBqdXN0IGRlc2NyaWJlIHRoZSBjYWxjdWxhdGlvbiByZWxhdGlvbnNoaXAsIGluIG90aGVyIHdvcmRzIFhCUkwganVzdCBkZXNjcmliZSB0aGF0IHdoYXRldmVyIGFtb3VudCB0aGF0IGNvbmNlcHQgQSBoYXMgaXMgdGhlIHRvdGFsIG9mIGNvbmNlcHRzIGIgYW5kIGMsIG5vdGhpbmcgbW9yZS4gDQoNCkNhbGN1bGF0aW9uIGxpbmtiYXNlIFhNTCBmaWxlOiAgDQpgYGB7ciBpc19leGFtcGxlX2NhbF9saW5rLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmc9J3htbCcsIEZpbGUgPSBoZXJlOjpoZXJlKCd4bWxfZmlsZXMvaW5jb21lU3RhdGVtZW50RXhhbXBsZScsJ2lzX2NhbC54bWwnKSkNCmBgYA0KICANCioqQ2FsY3VsYXRpb24gbGlua2Jhc2UgcmVsZXZhbnQgY29tcG9uZW50cyBjYW4gYmUgYW5hbHl6ZWQgYXMgZm9sbG93czoqKiAgDQoNCiMjIyMjIHJvbGVSZWYgIA0KRWxlbWVudCBgPHJvbGVSZWY+YCByZWZlcmVuY2VzIHRoZSBgPHJvbGVUeXBlPmAgZGVjbGFyYXRpb24gaW4gdGhlIHNjaGVtYSBhbmQgaXMgcmVwZWF0ZWQgZm9yIGVhY2ggYHJvbGVUeXBlYCBkZWNsYXJlZCwgZm9sbG93aW5nIGlzIHRoZSBgcm9sZVJlZmBgIGZyb20gb3VyIGV4YW1wbGU6ICANCmBgYHtyIGlzX2NhbF9yb2xlVHlwZSwgZWNobz1GQUxTRX0NCmlzX2NhbCA8LSB4bWwyOjpyZWFkX3htbChoZXJlOjpoZXJlKCd4bWxfZmlsZXMvaW5jb21lU3RhdGVtZW50RXhhbXBsZScsJ2lzX2NhbC54bWwnKSkNCg0Kcm9sZVJlZiA8LSB4bWwyOjp4bWxfZmluZF9hbGwoaXNfY2FsLCcuLy8qW2xvY2FsLW5hbWUoKT0icm9sZVJlZiJdJykgJT4lDQogIG1hcChmdW5jdGlvbih4KSB7DQogICAgYyh0YWc9eG1sMjo6eG1sX25hbWUoeCksIHhtbDI6OnhtbF9hdHRycyh4KSkNCiAgfSkgJT4lIGJpbmRfcm93cygpICU+JSBtdXRhdGUoZGVzY3JpcHRpb249YyhrYWJsZUV4dHJhOjp0ZXh0X3NwZWMoJ1NlZSByb2xlVHlwZScsIGxpbmsgPSAnI3JvbGUtdHlwZXMnKSkpDQoNCmsxMSA8LSBrbml0cjo6a2FibGUocm9sZVJlZiwgZXNjYXBlID0gRikgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKQ0KaHRtbHRvb2xzOjpkaXYoaHRtbHRvb2xzOjpIVE1MKGsxMSksIHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iKQ0KYGBgDQoNCiMjIyMjIFJlbGF0aW9ucyAoYXJjcykgIA0KVGhlIHJvb3QgZWxlbWVudCBpbiBjYXNlIG9mIGNhbGN1bGF0aW9uIHJlbGF0aW9uc2hpcCBpcyB1c3VhbGx5IHRoZSBncmFuZCB0b3RhbCBvZiBhbGwgb3RoZXIgY2FsY3VsYXRpb25zLCBpbiBvdXIgYEluY29tZSBTdGF0ZW1lbnRgIHRoZSByb290IGVsZW1lbnQgaXMgYE5ldCBQcm9maXRgIGZvciBsaW5rcm9sZSBgaHR0cDovL3h5ei5hYmMvcm9sZS9JbmNvbWVTdGF0ZW1lbnRgLCB0aGUgbmV0d29yayBjYW4gYmUgZGVzY3JpYmVkIGluIGEgdGFibGUgYXMgZm9sbG93cyAoYEBmcm9tYCBhbmQgYEB0b2AgcmVmZXJzIHRvIGxvY2F0b3JzIGlkcyk6ICANCmBgYHtyIGlzX2NhbF9uZXR3b3JrLCBlY2hvPUZBTFNFfQ0KbmV0d29ya19jYWwgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKGlzX2NhbCwnLi8vKltsb2NhbC1uYW1lKCk9ImNhbGN1bGF0aW9uQXJjIl0nKSAlPiUNCiAgbWFwKGZ1bmN0aW9uKHgpIHsNCiAgICBjKHRhZz14bWwyOjp4bWxfbmFtZSh4KSwgeG1sMjo6eG1sX2F0dHJzKHgpKQ0KICB9KSAlPiUgYmluZF9yb3dzKCkgJT4lIGFycmFuZ2UoZnJvbSwgb3JkZXIpDQoNCmtuaXRyOjprYWJsZShuZXR3b3JrX2NhbCwgZXNjYXBlID0gRikgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSBodG1sdG9vbHM6OmRpdihzdHlsZT0ib3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOiBub3dyYXA7IikNCmBgYA0KDQpfTm90ZXNfICANCg0KKiBgPGNhbGN1bGF0aW9uQXJjPmAgaXMgdXNlZCB0byBlc3RhYmxpc2ggY2FsY3VsYXRpb24gcmVsYXRpb25zaGlwcyBpbiBhIGNhbGN1bGF0aW9uIG5ldHdvcmsuICANCiogYHN1bW1hdGlvbi1pdGVtYCBhcmNyb2xlIGlzIHVzZWQgZm9yIGNhbGN1bGF0aW9uIHJlbGF0aW9uc2hpcCAgDQoqIGBAd2VpZ2h0YCBpcyB1c2VkIG9uIGBjYWxjdWxhdGlvbkFyY2AgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgY29uY2VwdCBpcyB0byBiZSBhZGRlZCAoYEB3ZWlnaHQ9MS4wYCkgb3Igc3VidHJhY3RlZCAoYEB3ZWlnaHQ9LTEuMGApLCBub3QgYWxzbyB0aGF0IHRoZSBjb3JlIGNvbmNlcHQgYEBiYWxhbmNlYCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBAd2VpZ2h0YCB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGFyaXRobWV0aWMgb3BlcmF0aW9uLiAgDQoqIGBAb3JkZXJgIGlzIHVzZWQgb24gYGNhbGN1bGF0aW9uQXJjYCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIGFwcGVhcmFuY2Ugb2YgY29uY2VwdCB3aGVuIHRoZSBjYWxjdWxhdGlvbiByZWxhdGlvbnNoaXAgaXMgcHJlc2VudGVkLiAgDQoNCiMjIyMjIEhpZXJhcmNoaWNhbCBWaWV3ICANCioqQSBoaWVyYXJjaGljYWwgdmlldyBvZiBwcmVzZW50YXRpb24gbGluayAoQ29uY2VwdHMgbGFiZWxzIGFyZSB1c2VkKSoqOiANCmBgYHtyIGlzX2NhbF9uZXR3b3JrX2hpZXIsIGVjaG89RkFMU0V9DQpkYXRhLmZyYW1lKGBDb25jZXB0IExhYmVsYD0gYygNCicxMDAwMCAtIFN0YXRlbWVudCAtIEluY29tZSBTdGF0ZW1lbnQnLA0KJ05ldCBQcm9maXQnLA0KJygxKSBHcm9zcyBQcm9maXQnLA0KJygxKSBSZXZlbnVlJywNCicoLTEpIENvc3Qgb2YgUmV2ZW51ZScsDQonKC0xKSBFeHBlbnNlcycpLA0Kd2VpZ2h0PWMoJycsJycsJzEuMCcsJzEuMCcsJy0xLjAnLCctMS4wJyksDQpiYWxhbmNlPWMoJycsICdjcmVkaXQnLCAnY3JlZGl0JywgJ2NyZWRpdCcsJ2RlYml0JywgJ2RlYml0JyksDQpkZXB0aD1jKCdDb250YWluZXInLCdSb290JywnMScsJzInLCcyJywnMScpKSAlPiUga25pdHI6OmthYmxlKGNvbC5uYW1lcyA9IGMocGFzdGUwKCdDb25jZXB0IExhYmVsJywga2FibGVFeHRyYTo6Zm9vdG5vdGVfbWFya2VyX3N5bWJvbCgxKSksJ1dlaWdodCcsJ0JhbGFuY2UnLCAnZGVwdGgnKSwgYWxpZ24gPSBjKCdsJywgJ2MnLCdjJyAsJ3InKSwgZXNjYXBlID0gRikgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGthYmxlRXh0cmE6OmFkZF9pbmRlbnQocG9zaXRpb25zID0gMiwgbGV2ZWxfb2ZfaW5kZW50ID0xICkgJT4lIA0KICBrYWJsZUV4dHJhOjphZGRfaW5kZW50KHBvc2l0aW9ucyA9IGMoMyw2KSwgbGV2ZWxfb2ZfaW5kZW50ID0yICkgJT4lIA0KICBrYWJsZUV4dHJhOjphZGRfaW5kZW50KHBvc2l0aW9ucyA9IGMoNCw1KSwgbGV2ZWxfb2ZfaW5kZW50ID0zICkgJT4lDQogIGthYmxlRXh0cmE6OmZvb3Rub3RlKHN5bWJvbD0iQ29uY2VwdHMgcHJlZmVycmVkIGxhYmVscyBhcmUgdXNlZCBpbiB0aGlzIHRhYmxlIikNCg0KDQpgYGANCg0KIyMjIyBMYWJlbCBsaW5rYmFzZSAgDQpMYWJlbCBsaW5rYmFzZSBpcyBhbiBleGFtcGxlIG9mIGBSZXNvdXJjZSBMaW5rYCwgaXQgaXMgdXNlZCB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbmNlcHRzIGFuZCB0aGVpciBsYWJlbHMsIGxhYmVsIGhlcmUgaXMgdGhlIGBSZXNvdXJjZWAuIEVhY2ggY29uY2VwdCBjYW4gaGF2ZSBtdWx0aXBsZSBsYWJlbHMgZGVzY3JpYmluZyB0aGUgY29uY2VwdCBpbiBkaWZmZXJlbnQgcm9sZXMsIGZvciBleGFtcGxlIGJlZ2lubmluZyBiYWxhbmNlIG9yIGVuZGluZyBiYWxhbmNlIGFsc28gYSBjb25jZXB0IGNhbiBoYXZlIGxhYmVscyBpbiBtdWx0aXBsZSBsYW5ndWFnZXMuICANCg0KTGFiZWwgbGluayB1c2VzIGA8bGFiZWxBcmM+YCB0byBsaW5rIGEgY29uY2VwdCB0byBpdHMgbGFiZWxzLCBhbmQgdXNlcyBgQGFyY3JvbGVgIGBodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvYXJjcm9sZS9jb25jZXB0LWxhYmVsYC4gIA0KDQojIyMjIyBMYWJlbCBSb2xlcyAgDQpFYWNoIGxhYmVsICh0aGUgcmVzb3VyY2UpIGlzIGRlZmluZWQgdXNpbmcgdGhlIGVsZW1lbnQgYDxsYWJlbD5gIGZvcm0gbmFtZXNwYWNlIGB7aHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2xpbmtiYXNlfWAuIFRoZSBgQHJvbGVgIGFuZCBgQHhtbDpsYW5nYCBhdHRyaWJ1dGVzIG9uIHRoZSBgPGxhYmVsPmAgZWxlbWVudCBhcmUgdXNlZCB0byBpZGVudGlmeSB0aGUgcm9sZSBvZiB0aGUgbGFiZWwgYW5kIGl0cyBsYW5ndWFnZS4gWEJSTCBzcGVjaWZpY2F0aW9ucyBzcGVjaWZ5IHNvbWUgc3RhbmRhcmQgbGFiZWwgYHJvbGVzYCwgc29tZSBvZiB0aGVtIGFyZSBhcyBmb2xsb3dzOiAgIA0KDQpgYGB7ciBpc19sYWJfY2FzaCwgZWNobz1GQUxTRX0NCmRhdGEuZnJhbWUoDQogIHJvbGUgPSBjKA0KICAgICc8c3Bhbj5PbWl0dGVkIHJvbGUgYXR0cmlidXRlIE9SPC9zcGFuPg0KICAgIDxzcGFuPmh0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9yb2xlL2xhYmVsPC9zcGFuPicsDQogICAgJ2h0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9yb2xlL3RlcnNlTGFiZWwnLA0KICAgICdodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvcm9sZS92ZXJib3NlTGFiZWwnLA0KICAgICdodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvcm9sZS90b3RhbExhYmVsJywNCiAgICAnDQogICAgPHNwYW4+aHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL3JvbGUvcGVyaW9kU3RhcnRMYWJlbDwvc3Bhbj4NCiAgICA8c3Bhbj5odHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvcm9sZS9wZXJpb2RFbmRMYWJlbDwvc3Bhbj4gDQogICAgJywgJ2h0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9yb2xlL2RvY3VtZW50YXRpb24nLCAnLi4uJw0KICApLA0KICBtZWFuaW5nID0gYygNCiAgICAnU3RhbmRhcmQgbGFiZWwgZm9yIGEgQ29uY2VwdC4nLA0KICAgICdTaG9ydCBsYWJlbCBmb3IgYSBDb25jZXB0LCBvZnRlbiBvbWl0dGluZyB0ZXh0IHRoYXQgc2hvdWxkIGJlIGluZmVyYWJsZSB3aGVuIHRoZSBjb25jZXB0IGlzIHJlcG9ydGVkIGluIHRoZSBjb250ZXh0IG9mIG90aGVyIHJlbGF0ZWQgY29uY2VwdHMuJywNCiAgICAnRXh0ZW5kZWQgbGFiZWwgZm9yIGEgQ29uY2VwdCwgbWFraW5nIHN1cmUgbm90IHRvIG9taXQgdGV4dCB0aGF0IGlzIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgbGFiZWwgdG8gYmUgdW5kZXJzdG9vZCBvbiBhIHN0YW5kIGFsb25lIGJhc2lzLicsDQogICAgJ1RoZSBsYWJlbCBmb3IgYSBDb25jZXB0IGZvciB1c2UgaW4gcHJlc2VudGluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25jZXB0IHdoZW4gaXQgaXMgYmVpbmcgcmVwb3J0ZWQgYXMgdGhlIHRvdGFsIG9mIGEgc2V0IG9mIG90aGVyIHZhbHVlcy4nLA0KICAgICcgaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL3JvbGUvcGVyaW9kRW5kTGFiZWwJVGhlIGxhYmVsIGZvciBhIENvbmNlcHQgd2l0aCBwZXJpb2RUeXBlPSJpbnN0YW50IiBmb3IgdXNlIGluIHByZXNlbnRpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uY2VwdCB3aGVuIGl0IGlzIGJlaW5nIHJlcG9ydGVkIGFzIGEgc3RhcnQgKGVuZCkgb2YgcGVyaW9kIHZhbHVlLicsDQogICAgJ0RvY3VtZW50YXRpb24gb2YgYSBDb25jZXB0LCBwcm92aWRpbmcgYW4gZXhwbGFuYXRpb24gb2YgaXRzIG1lYW5pbmcgYW5kIGl0cyBhcHByb3ByaWF0ZSB1c2FnZSBhbmQgYW55IG90aGVyIGRvY3VtZW50YXRpb24gZGVlbWVkIG5lY2Vzc2FyeS4nLA0KICAgICcuLi4nDQogICAgDQogICkNCikgJT4lIGtuaXRyOjprYWJsZShlc2NhcGUgPSBGKSAlPiUga2FibGVFeHRyYTo6a2FibGVfY2xhc3NpYygpICU+JSANCiAga2FibGVFeHRyYTo6cm93X3NwZWMoMTo1LCBleHRyYV9jc3MgPSAiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGxpZ2h0Z3JheSIpDQpgYGANCkZvciB0aGUgZnVsbCBsaXN0IG9mIHJvbGVzIChbU2VlIFhCUkwgU3BlY2lmaWNhdGlvbnMgVGFibGUgOF0oaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi9YQlJMLTIuMS9SRUMtMjAwMy0xMi0zMS9YQlJMLTIuMS1SRUMtMjAwMy0xMi0zMStjb3JyZWN0ZWQtZXJyYXRhLTIwMTMtMDItMjAuaHRtbCNfNS4yLjIuMi4yKXt0YXJnZXQ9X2JsYW5rfSkuDQoNCkluIHRoaXMgZXhhbXBsZSB0aGUgRW5nbGlzaCBsYWJlbHMgYW5kIEFyYWJpYyBsYWJlbHMgYXJlIHN0b3JlZCBpbiBzZXBhcmF0ZSBmaWxlcyAoYGlzX2xhYl9lbi54bWxgIGFuZCBgaXNfbGFiX2FyLnhtbGApLCBmaWxlcyBkaXNwbGF5ZWQgYmVsb3c6ICANCg0KQXJhYmljIGxpbmtiYXNlIFhNTCBmaWxlOiAgDQpgYGB7ciBpc19leGFtcGxlX2xhYl9hciwgZWNobz1GQUxTRX0NCmZuX0NvZGVDaHVua091dChsYW5nPSd4bWwnLCBGaWxlID0gaGVyZTo6aGVyZSgneG1sX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUnLCdpc19sYWJfYXIueG1sJykpDQpgYGANCg0KDQpFbmdsaXNoIGxpbmtiYXNlIFhNTCBmaWxlOiAgDQpgYGB7ciBpc19leGFtcGxlX2xhYl9lbiwgZWNobz1GQUxTRX0NCmZuX0NvZGVDaHVua091dChsYW5nPSd4bWwnLCBGaWxlID0gaGVyZTo6aGVyZSgneG1sX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUnLCdpc19sYWJfZW4ueG1sJykpDQpgYGANCg0KIyMjIyMgcm9sZVJlZiAgDQpFbGVtZW50IGA8cm9sZVJlZj5gIGlzIG5vdCB1c2VkIGluIHRoaXMgY2FzZSBvZiBsYWJlbCBsaW5rIGJlY2F1c2Ugd2UgZG8gbm90IG5lZWQgdG8gcGFydGl0aW9uIHRoZSBsYWJlbCBsaW5rcyBieSByb2xlcyAod2UgY2FuIGRvIHRoYXQgYnV0IHdhcyBub3QgZG9uZSBpbiB0aGlzIGNhc2UpLCBpbnN0ZWFkIHRoZSBkZWZhdWx0IHN0YW5kYXJkIGxpbmsgcm9sZSBgaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL3JvbGUvbGlua2Agd2FzIHVzZWQgb24gdGhlIGBsYWJlbExpbmtgIGVsZW1lbnQuDQoNClNpbmNlIGxhYmVsIGxpbmsgaXMgYSByZXNvdXJjZSBsaW5rLCBpdCBkb2VzIG5vdCBoYXZlIGEgcm9vdCBlbGVtZW50LCBpdCBqdXN0IGxpbmtzIHRoZSBjb25jZXB0IHRvIHRoZSByZXNvdXJjZXMuICANCg0KIyMjIyMgTGFiZWwgUmVzb3VyY2VzICANClRhYmxlIHNob3dpbmcgbGFiZWwgcmVzb3VyY2UgZGVjbGFyYXRpb25zOg0KYGBge3IgaXNfbGFiX25ldHdvcmssIGVjaG89RkFMU0V9DQpsYWJfZW4gPC0geG1sMjo6cmVhZF94bWwoaGVyZTo6aGVyZSgneG1sX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUnLCdpc19sYWJfZW4ueG1sJykpICU+JSANCiAgeG1sMjo6eG1sX2ZpbmRfYWxsKCcuLy8qW2xvY2FsLW5hbWUoKT0ibGFiZWwiXScpICU+JQ0KICBtYXAoZnVuY3Rpb24oeCkgew0KICAgIGModGFnPXhtbDI6OnhtbF9uYW1lKHgpLCB4bWwyOjp4bWxfYXR0cnMoeCksIExhYmVsPXhtbDI6OnhtbF90ZXh0KHgpKQ0KICB9KSAlPiUgYmluZF9yb3dzKCkNCg0KIyBsYWJfYXIgPC0geG1sMjo6cmVhZF9YTUwoaGVyZTo6aGVyZSgnWE1MX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUnLCdpc19sYWJfYXIuWE1MJykpICU+JSANCiMgICB4bWwyOjpYTUxfZmluZF9hbGwoJy4vLypbbG9jYWwtbmFtZSgpPSJsYWJlbCJdJykgJT4lDQojICAgbWFwKGZ1bmN0aW9uKHgpIHsNCiMgICAgIGModGFnPXhtbDI6OlhNTF9uYW1lKHgpLCB4bWwyOjpYTUxfYXR0cnMoeCksIExhYmVsPXhtbDI6OlhNTF90ZXh0KHgpKQ0KIyAgIH0pICU+JSBiaW5kX3Jvd3MoKQ0KDQoNCiMgbGlzdChsYWJfYXIsbGFiX2VuKSAlPiUgYmluZF9yb3dzKCkgJT4lIG11dGF0ZShMYWJlbD0pDQpsYWJfZW4gJT4lDQprbml0cjo6a2FibGUoJ2h0bWwnLCBlc2NhcGUgPVQpICU+JSBrYWJsZUV4dHJhOjprYWJsZV9jbGFzc2ljKCkgJT4lDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSBodG1sdG9vbHM6OmRpdihzdHlsZT0ib3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOiBub3dyYXA7IikNCmBgYA0KDQpfTm90ZXNfICANCg0KKiBBcmFiaWMgTGFiZWxzIGFyZSBub3Qgc2hvd24gaGVyZSBkdWUgdG8gZW5jb2RpbmcgaXNzdWVzLCBwbGVhc2Ugc2VlIGZpbGUgYH4veG1sX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUvaXNfbGFiX2FyLnhtbGAuICANCiogYEBsYW5nYCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIG9mIHRoZSBsYWJlbCwgdGhpcyB3aWxsIGhlbHAgc3dpdGNoaW5nIGJldHdlZW4gbGFiZWwgbGFuZ3VhZ2VzIGluIGFueSBYQlJMIHByb2Nlc3Nvci4gIA0KKiBgQHJvbGVgIGlzIHVzZWQgdG8gc3BlY2lmeSBsYWJlbCByb2xlLCBvbmUgY29uY2VwdCBjYW4gaGF2ZSBtYW55IGxhYmVscyBidXQgZWFjaCBsYWJlbCBzaG91bGQgaGF2ZSB1bmlxdWUgbGFiZWwgcm9sZS4gIA0KDQoNCiMjIyMgRGVmaW5pdGlvbiBsaW5rYmFzZSAgDQpEZWZpbml0aW9uIExpbmsgaXMgdXNlZCB0byBkZWZpbmUgcmVsYXRpb25zIGJldHdlZW4gcGFpcnMgb2YgY29uY2VwdHMgdGhhdCBnb2VzIGJleW9uZCBjYWxjdWxhdGlvbiBvciBwcmVzZW50YXRpb24gbGlua3MuIEVsZW1lbnQgYDxkZWZpbml0aW9uTGluaz5gIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBhIGRlZmluaXRpb24gbmV0d29yayBmb3IgYSBsaW5rclJvbGUgc3BlY2lmaWVkIGJ5IGBAcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBgPGRlZmluaXRpb25MaW5rPmAgZWxlbWVudCwgYDxkZWZpbml0aW9uQXJjPmAgaXMgdXNlZCB0byBlc3RhYmxpc2ggdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIGNvbmNlcHRzIHBhaXJzIGZvciB0aGUgcmVsYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBgQHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgYDxkZWZpbml0aW9uQXJjPmAgZWxlbWVudC4gIA0KDQpYQlJMIHNwZWNpZmljYXRpb25zIGRlZmluZXMgc29tZSBzdGFuZGFyZCBkZWZpbml0aW9uIGBhcmNSb2xlc2AgKFtzZWUgWEJSTCBzcGVjaWZpY2F0aW9uIHNlY3Rpb24gNS4yLjYuMl0oaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi9YQlJMLTIuMS9SRUMtMjAwMy0xMi0zMS9YQlJMLTIuMS1SRUMtMjAwMy0xMi0zMStjb3JyZWN0ZWQtZXJyYXRhLTIwMTMtMDItMjAuaHRtbCNfNS4yLjYuMikpLCBhbmQgaGVyZSBhcmUgdGhlIGRlZmluaXRpb25zIGZyb20gX1RIRCBzZWN0aW9uIDMuNC40LjNfOiAgDQoNCj4xLglHZW5lcmFsLXNwZWNpYWwgLSBUaGlzIHJlbGF0aW9uc2hpcCBpbmRpY2F0ZXMgdGhhdCBvbmUgY29uY2VwdCBvZiBhIHBhaXIgaXMgYSBtb3JlIHNwZWNpYWxpemVkIGZvcm0gb2YgYW5vdGhlciBjb25jZXB0LiBGb3IgaW5zdGFuY2UsIGluIHRoZSB3aWRnZXQgZXhhbXBsZSwgdGhlIHdpZGdldCB0eXBlIEFuZ3VsYXJXaWRnZXRzIGNhbiBiZSBnZW5lcmFsIChyZWZlcnJpbmcgdG8gYW55IHdpZGdldCB0eXBlIHRoYXQgaGFzIGFuZ2xlcyksIHdoaWxlIHRoZSB3aWRnZXQgdHlwZSBUcmlhbmd1bGFyV2lkZ2V0cyBpcyBtb3JlIHNwZWNpZmljLg0KPjIuCUVzc2VuY2UtYWxpYXMgLSBUaGlzIHJlbGF0aW9uc2hpcCBpbmRpY2F0ZXMgdGhhdCBvbmUgY29uY2VwdCBvZiBhIHBhaXIgZXNzZW50aWFsbHkgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIG90aGVyIGNvbmNlcHQuIEZvciBleGFtcGxlLCBvbmUgcmVwb3J0aW5nIGVudGl0eSBtYXkgdXNlIHRoZSBjb25jZXB0IFdpZGdldHMgdG8gcmVmZXIgdG8gaXRzIHByb2R1Y3QsIGFuZCBhbm90aGVyIG1heSBwcmVmZXIgdGhlIGNvbmNlcHQgR2l6bW9zLCBidXQgdGhlIHVuZGVybHlpbmcgbWVhbmluZywgdGhhdCB0aGVzZSBjb25jZXB0cyBhcmUgcHJvZHVjdHMsIGlzIHRoZSBzYW1lLiBUaGUgZXNzZW5jZS1hbGlhcyBkZWZpbml0aW9uIHJlZmxlY3RzIGEgY2hhbmdlIGluIHRlcm1pbm9sb2d5IHJhdGhlciB0aGFuIHNlbWFudGljIG1lYW5pbmcuDQo+My4JUmVxdWlyZXMtZWxlbWVudCAtIFRoaXMgcmVsYXRpb25zaGlwIGluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiBvbmUgY29uY2VwdCBpcyByZXF1aXJlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29uY2VwdCBpbiB0aGUgcGFpciBpcyBwcmVzZW50LiBGb3IgZXhhbXBsZSwgaW4gdGhlIHdpZGdldCByZXBvcnQgd2l0aCBib3RoIGNvbmNlcHQgY29yZSBkaW1lbnNpb25zIFdpZGdldHNTb2xkIGFuZCBQcmljZVBlcldpZGdldCwgUHJpY2VQZXJXaWRnZXQgcmVxdWlyZXMgYSB2YWx1ZSBmb3IgV2lkZ2V0c1NvbGQuDQo+NC4JU2ltaWxhci10dXBsZXMgLSBUaGlzIHJlbGF0aW9uc2hpcCBpcyBvcGVyYXRpb25hbGx5IHRoZSBzYW1lIGFzIHRoZSBlc3NlbmNlLWFsaWFzIGRlZmluaXRpb24gYnV0IHJlc2VydmVkIGZvciB1c2FnZSB3aXRoIHR1cGxlcy4gVHVwbGVzIGFyZSBub3QgY29tbW9ubHkgdXNlZC4gIA0KPg0KPkFkZGl0aW9uYWxseSwgdGhlIFhCUkwgRGltZW5zaW9ucyBTcGVjaWZpY2F0aW9uIGFsbG93cyBmb3IgbW9yZSBkZWZpbml0aW9uIHR5cGVzLiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIHJlbGF0aW9uc2hpcHMgcGVydGFpbmluZyB0byB0aGUgY29tcG9uZW50cyBvZiBhIGRpbWVuc2lvbiBpbiBYQlJMLiBUaGUgZGVmaW5pdGlvbnMgZXhpc3QgYmV0d2VlbiBhIGNvbmNlcHQgYW5kIGEgdGF4b25vbXktZGVmaW5lZCBkaW1lbnNpb24gdG8gZGVmaW5lIHRoZSBoaWVyYXJjaGljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlbS4gRXhhbXBsZXMgb2YgZWFjaCBjYW4gYmUgc2VlbiBpbiBGaWd1cmUgMy0xMC4NCj4NCj4xLglEaW1lbnNpb24tZGVmYXVsdCAtIFRoaXMgcmVsYXRpb25zaGlwIGluZGljYXRlcyB0aGF0IHRoZSBjb25jZXB0IGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgdGF4b25vbXktZGVmaW5lZCBkaW1lbnNpb24uDQo+Mi4JRGltZW5zaW9uLWRvbWFpbiAtIFRoaXMgcmVsYXRpb25zaGlwIGluZGljYXRlcyB0aGF0IHRoZSBjb25jZXB0IHJlcHJlc2VudHMgdGhlIGRvbWFpbiBvZiB0aGUgdGF4b25vbXktZGVmaW5lZCBkaW1lbnNpb24uDQo+My4JRG9tYWluLW1lbWJlciAtIFRoaXMgcmVsYXRpb25zaGlwIGluZGljYXRlcyB0aGF0IG9uZSBjb25jZXB0IGlzIGEgbWVtYmVyIG9mIHRoZSBkb21haW4gb2YgdGhlIG90aGVyIGNvbmNlcHQgdGhhdCBpcyBwYXJ0IG9mIGEgdGF4b25vbXktZGVmaW5lZCBkaW1lbnNpb24uIFRoaXMgcmVsYXRpb25zaGlwIGNhbiBleGlzdCBiZXR3ZWVuIG1hbnkgY29uY2VwdHMuIEZvciBleGFtcGxlLCBhIE5vcnRoZWFzdCBtZW1iZXIgbWF5IGJlbG9uZyB0byBhIEdlb2dyYXBoaWNMb2NhdGlvbiBheGlzLCBidXQgY29tcHJpc2luZyB0aGlzIE5vcnRoZWFzdCBtZW1iZXIgaXMgYSBncm91cCBvZiBub3J0aGVhc3Rlcm4gc3RhdGVzIGluIHRoZSBVUy4gVGhlc2UgZWFjaCBoYXZlIHRoZSBkb21haW4tbWVtYmVyIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBOb3J0aGVhc3QgY29uY2VwdC4NCj5gciB0dWZ0ZTo6cXVvdGVfZm9vdGVyKCctLS0gW1RESCBzZWN0aW9uIDMuNC40LjMgcGFnZSA1MF0oaHR0cHM6Ly94YnJsdXMuZ2l0aHViLmlvL2RvY3MvdGRoLmh0bWwpJylgDQoNCkluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgWEJSTCBEaW1lbnNpb25zIFNwZWNpZmljYXRpb25zIGRlZmluZXMgdGhlIGZvbGxvd2luZyByZWxhdGlvbnM6ICANCg0KKiBgYWxsIGFuZCBub3RBbGxgOiB0b2dldGhlciBhbHNvIHJlZmVycmVkIHRvIGFzIGBoYXMgaHlwZXJjdWJlYCBpcyBhIHJlbGF0aW9uIGJldHdlZW4gYSBwcmltYXJ5IGl0ZW0gZGVjbGFyYXRpb24gYW5kIGEgaHlwZXJjdWJlIGl0ZW0sIHRoZSBgYWxsYCByZWxhdGlvbnMgbWVhbnMgdGhhdCB0aGUgcHJpbWFyeSBpdGVtIGNhbiBiZSB1c2VkIHdpdGggYWxsIHRoZSBkaW1lbnNpb25zIGluY2x1ZGVkIGluIHRoZSBoeXBlcmN1YmUsIGBub3RBbGxgIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkgaXRlbSBjYW5ub3QgYmUgdXNlZCB3aXRoIGFueSBkaW1lbnNpb24gaW4gdGhlIGh5cGVyY3ViZS4gSW4gYWRkaXRpb24gdG8gZGVmaW5pbmcgZGltZW5zaW9uYWwgcmVsYXRpb24NCg0KKiBUaGUgYEBjbG9zZWRgIGF0dHJpYnV0ZSBvZiBhIGh5cGVyY3ViZSB0aGF0IHRha2VzIGEgdHJ1ZS9mYWxzZSB2YWx1ZSwgaWYgdHJ1ZSBpdCBzcGVjaWZpZXMgdGhhdCBhbGwgdGF4b25vbXktZGVmaW5lZCBkaW1lbnNpb25zIGluIHRoZSBoeXBlcmN1YmUgbXVzdCBpbnRlcnNlY3Qgb24gYSBmYWN0IGluIG9yZGVyIGZvciB0aGF0IGZhY3QgdG8gYmUgcGFydCBvZiB0aGUgaHlwZXJjdWJlLCBpZiBmYWxzZSBhbnkgb2YgdGhlIHRheG9ub215LWRlZmluZWQgZGltZW5zaW9ucyBpbiB0aGUgaHlwZXJjdWJlIGNhbiBpbnRlcnNlY3Qgb24gYSBmYWN0IGluIG9yZGVyIGZvciB0aGF0IGZhY3QgdG8gYmUgcGFydCBvZiB0aGUgaHlwZXJjdWJlLiAgDQoNCiogYGh5cGVyY3ViZS1kaW1lbnNpb25gIGEgcmVsYXRpb24gYmV0d2VlbiBhIGh5cGVyY3ViZSBhbmQgYSBkaW1lbnNpb24uICANCg0KKiBTb21ldGltZXMgYXV0aG9ycyBvZiBhbiBleHRlbnNpb24gdGF4b25vbXkgbWF5IHdhbnQgdG8gcHJvaGliaXQgdGhlIHVzZSBvZiBzb21lIHByaW1hcnkgaXRlbXMgZnJvbSBpbXBvcnRlZCB0YXhvbm9teSwgb25lIG9mIHRoZSB3YXlzIHRoaXMgZG9uZSBpcyBieSBsaW5raW5nIHRoZSBwcm9oaWJpdGVkIGl0ZW1zIHRvIGFuIGVtcHR5IGh5cGVyY3ViZSAoYSBoeXBlcmN1YmUgd2l0aCBvbmUgZGltZW5zaW9uIHRoYXQgZG9lc25vdCBoYXZlIGFueSBtZW1iZXJzKS4NCg0KSW4gb3VyIGV4YW1wbGUsIGRlZmluaXRpb24gbGlua2Jhc2UgY29udGFpbnMgb25seSBkaW1lbnNpb25hbCByZWxhdGlvbnNoaXAgdG8gY3JlYXRlIHRoZSBpbmNvbWUgc3RhdGVtZW50IHRhYmxlIHdpdGggUHJvZHVjdCBBbmQgU2VydmljZSBkaW1lbnNpb25zLiAgDQoNCkRlZmluaXRpb24gbGlua2Jhc2UgWE1MIGZpbGU6ICANCmBgYHtyIGlzX2V4YW1wbGVfZGVmX2xpbmssIGVjaG89RkFMU0V9DQpmbl9Db2RlQ2h1bmtPdXQobGFuZz0neG1sJywgRmlsZSA9IGhlcmU6OmhlcmUoJ3htbF9maWxlcy9pbmNvbWVTdGF0ZW1lbnRFeGFtcGxlJywnaXNfZGVmLnhtbCcpKQ0KYGBgDQogIA0KIyMjIyMgcm9sZVJlZiBhbmQgYXJjcm9sZVJlZiAgDQpFbGVtZW50IGA8cm9sZVJlZj5gIHJlZmVyZW5jZXMgdGhlIGA8cm9sZVR5cGU+YCBkZWNsYXJhdGlvbiBpbiB0aGUgc2NoZW1hIGFuZCBpcyByZXBlYXRlZCBmb3IgZWFjaCBgcm9sZVR5cGVgIGRlY2xhcmVkLCBmb2xsb3dpbmcgaXMgdGhlIGByb2xlUmVmYGAgZnJvbSBvdXIgZXhhbXBsZTogIA0KYGBge3IgaXNfZGVmX3JvbGVUeXBlLCBlY2hvPUZBTFNFfQ0KaXNfZGVmIDwtIHhtbDI6OnJlYWRfeG1sKGhlcmU6OmhlcmUoJ3htbF9maWxlcy9pbmNvbWVTdGF0ZW1lbnRFeGFtcGxlJywnaXNfZGVmLnhtbCcpKQ0KDQpyb2xlUmVmIDwtIHhtbDI6OnhtbF9maW5kX2FsbChpc19kZWYsJy4vLypbbG9jYWwtbmFtZSgpPSJyb2xlUmVmIiBvciBsb2NhbC1uYW1lKCk9ImFyY3JvbGVSZWYiXScpICU+JQ0KICBtYXAoZnVuY3Rpb24oeCkgew0KICAgIGModGFnPXhtbDI6OnhtbF9uYW1lKHgpLCB4bWwyOjp4bWxfYXR0cnMoeCkpDQogIH0pICU+JSBiaW5kX3Jvd3MoKQ0KDQprbml0cjo6a2FibGUocm9sZVJlZiwgZXNjYXBlID0gRikgJT4lIA0KICBrYWJsZUV4dHJhOjprYWJsZV9jbGFzc2ljKCkgJT4lIA0KICBodG1sdG9vbHM6OkhUTUwoKSAlPiUgDQogIGh0bWx0b29sczo6ZGl2KHN0eWxlPSJvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6IG5vd3JhcDsiKQ0KYGBgDQpfTm90ZV8gYGFyY3JvbGVSZWZgIGlzIHVzZWQgdG8gcmVmZXJlbmNlIGFyY3JvbGVzIGRlY2xhcmVkIGluIFhCUkwgRGltZW5zaW9ucyBzcGVjaWZpY2F0aW9ucy4NCg0KIyMjIyMgUmVsYXRpb25zIChhcmNzKSAgDQpJbiB0aGlzIGV4YW1wbGUgb25seSByZWxhdGlvbnMgZnJvbSBYQlJMIGRpbWVuc2lvbnMgYXJlIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gbGlua2Jhc2UgZm9yIHRoZSBsaW5rcm9sZSBgaHR0cDovL3h5ei5hYmMvcm9sZS9JbmNvbWVTdGF0ZW1lbnRgLiBUaGUgZGltZW5zaW9uYWwgcmVsYXRpb25zIGFyZSBzb21ld2hhdCBzaW1pbGFyIHRvIHByZXNlbnRhdGlvbiByZWxhdGlvbnMgaW4gZm9ybSwgYnV0IHdpdGggZGlmZmVyZW50IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgcm9vdCBlbGVtZW50IGlzIGFsc28gYEluY29tZSBTdGF0ZW1lbnQgW0Fic3RyYWN0XWAgdGhhdCBpcyBtZWFudCB0byBncm91cCB0b2dldGhlciBhbGwgSW5jb21lIHN0YXRlbWVudCBoeXBlcmN1YmVzLCB0aGUgbmV0d29yayBjYW4gYmUgZGVzY3JpYmVkIGluIGEgdGFibGUgYXMgZm9sbG93cyAoYEBmcm9tYCBhbmQgYEB0b2AgcmVmZXJzIHRvIGxvY2F0b3JzIGlkcyk6ICANCmBgYHtyIGlzX2RlZl9uZXR3b3JrLCBlY2hvPUZBTFNFfQ0KbmV0d29yayA8LSB4bWwyOjp4bWxfZmluZF9hbGwoaXNfZGVmLCcuLy8qW2xvY2FsLW5hbWUoKT0iZGVmaW5pdGlvbkFyYyJdJykgJT4lDQogIG1hcChmdW5jdGlvbih4KSB7DQogICAgYyh0YWc9eG1sMjo6eG1sX25hbWUoeCksIHhtbDI6OnhtbF9hdHRycyh4KSkNCiAgfSkgJT4lIGJpbmRfcm93cygpICU+JSBhcnJhbmdlKGZyb20sIG9yZGVyKQ0KDQprbml0cjo6a2FibGUobmV0d29yaywgZXNjYXBlID0gRikgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSBodG1sdG9vbHM6OmRpdihzdHlsZT0ib3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOiBub3dyYXA7IikNCmBgYA0KDQpfTm90ZXNfICANCg0KKiBgPGRlZmluaXRpb25BcmM+YCBpcyB1c2VkIHRvIGVzdGFibGlzaCBkaW1lbnNpb25hbCByZWxhdGlvbnNoaXBzLiAgDQoqIGBhcmNyb2xlc2AgdXNlZCBhcmUgZGVmaW5lZCBpbiBYQlJMIERpbWVuc2lvbnMgc3BlY2lmaWNhdGlvbnMuDQoqIGBAY2xvc2VkYCBhbmQgYEBjb250ZXhFbGVtZW50YCBvbiBgPGRlZmluaXRpb25BcmM+YCByZWxhdGlvbiBiZXR3ZWVuIGBleGFtcGxlX1N0YXRlbWVudExpbmVJdGVtc2AgYW5kIGBleGFtcGxlX0luY29tZVN0YXRlbWVudFRhYmxlYCB3aXRoIHJvbGUgYGh0dHA6Ly94YnJsLm9yZy9pbnQvZGltL2FyY3JvbGUvYWxsYCBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoYXQgYWxsIHRheG9ub215LWRlZmluZWQgZGltZW5zaW9ucyBpbiB0aGUgaHlwZXJjdWJlIG11c3QgaW50ZXJzZWN0IG9uIGEgZmFjdCBpbiBvcmRlciBmb3IgdGhhdCBmYWN0IHRvIGJlIHBhcnQgb2YgdGhlIGh5cGVyY3ViZSwgYW5kIHRoZSBkaW1lbnNpb25zIG11c3QgYmUgYHNlZ21lbnRgIGRpbWVuc2lvbnMgKGkuZS4gbGlua2VkIHRocm91Z2ggY29udGV4dCBzZWdtZW50KS4gDQoqIGBAb3JkZXJgIGlzIHVzZWQgb24gYGRlZmluaXRpb25BcmNgIHRvIGRldGVybWluZSB0aGUgb3JkZXIgb2YgYXBwZWFyYW5jZSBvZiBjb25jZXB0IHdoZW4gcHJlc2VudGVkLiAgDQoNCiMjIyMjIEhpZXJhcmNoaWNhbCBWaWV3ICANCioqQSBoaWVyYXJjaGljYWwgdmlldyBvZiBwcmVzZW50YXRpb24gbGluayAoQ29uY2VwdHMgbGFiZWxzIGFyZSB1c2VkKSoqOiANCmBgYHtyIGlzX2RlZl9uZXR3b3JrX2hpZXIsIGVjaG89RkFMU0V9DQoNCmxpc3QoDQpjKCcxMDAwMCAtIFN0YXRlbWVudCAtIEluY29tZSBTdGF0ZW1lbnQnLCAnJywgJ0NvbnRhaW5lcicpLA0KYygnSW5jb21lIFN0YXRlbWVudCBbQWJzdHJhY3RdJywgJycsICdSb290JyksDQpjKCdTdGF0ZW1lbnQgW0xpbmUgSXRlbXNdJywgJ2RvbWFpbi1tZW1iZXInLCAnMScpLA0KYygnSW5jb21lIFN0YXRlbWVudCBbVGFibGVdJywgJ2FsbCcsICcyJyksDQpjKCdQcm9kdWN0IEFuZCBTZXJ2aWNlIFtBeGlzXScsICdoeXBlcmN1YmUtZGltZW5zaW9uJywgJzMnKSwNCmMoJ1Byb2R1Y3QgQW5kIFNlcnZpY2UgW0RvbWFpbl0nLCAnZGltZW5zaW9uLWRvbWFpbicsICc0JyksDQpjKCdQcm9kdWN0IFtNZW1iZXJdJywgJ2RvbWFpbi1tZW1iZXInLCAnNScpLA0KYygnU2VydmljZSBbTWVtYmVyXScsICdkb21haW4tbWVtYmVyJywgJzUnKSwNCmMoJ1JldmVudWUnLCAnZG9tYWluLW1lbWJlcicsICcyJyksDQpjKCdDb3N0IG9mIFJldmVudWUnLCAnZG9tYWluLW1lbWJlcicsICcyJyksDQpjKCdHcm9zcyBQcm9maXQnLCAnZG9tYWluLW1lbWJlcicsICcyJyksDQpjKCdFeHBlbnNlcycsICdkb21haW4tbWVtYmVyJywgJzInKSwNCmMoJ05ldCBQcm9maXQnLCAnZG9tYWluLW1lbWJlcicsICcyJykNCg0KKSAlPiUgbWFwKGZ1bmN0aW9uKHgpe25hbWVzKHgpIDwtIGMoJ0NvbmNlcHQgTGFibGUnLCAnYXJjcm9sZScsICdkZXB0aCcpOyByZXR1cm4oeCl9KSAlPiUgDQogIGJpbmRfcm93cygpICU+JSANCmtuaXRyOjprYWJsZShjb2wubmFtZXMgPSBjKHBhc3RlMCgnQ29uY2VwdCBMYWJlbCcsIGthYmxlRXh0cmE6OmZvb3Rub3RlX21hcmtlcl9zeW1ib2woMSkpLCdhcmNyb2xlJywgJ2RlcHRoJyksIGFsaWduID0gYygnbCcsICdsJywgJ3InKSwgZXNjYXBlID0gRikgJT4lIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGthYmxlRXh0cmE6OmFkZF9pbmRlbnQocG9zaXRpb25zID0gMiwgbGV2ZWxfb2ZfaW5kZW50ID0xICkgJT4lIA0KICBrYWJsZUV4dHJhOjphZGRfaW5kZW50KHBvc2l0aW9ucyA9IDMsIGxldmVsX29mX2luZGVudCA9MiApICU+JSANCiAga2FibGVFeHRyYTo6YWRkX2luZGVudChwb3NpdGlvbnMgPSBjKDQsOToxMyksIGxldmVsX29mX2luZGVudCA9MyApICU+JSANCiAga2FibGVFeHRyYTo6YWRkX2luZGVudChwb3NpdGlvbnMgPSA1LCBsZXZlbF9vZl9pbmRlbnQgPTQpICU+JSANCiAga2FibGVFeHRyYTo6YWRkX2luZGVudChwb3NpdGlvbnMgPSA2LCBsZXZlbF9vZl9pbmRlbnQgPTUpICU+JSANCiAga2FibGVFeHRyYTo6YWRkX2luZGVudChwb3NpdGlvbnMgPSBjKDcsOCksIGxldmVsX29mX2luZGVudCA9NikgJT4lIA0KICBrYWJsZUV4dHJhOjpmb290bm90ZShzeW1ib2w9IkNvbmNlcHRzIHByZWZlcnJlZCBsYWJlbHMgYXJlIHVzZWQgaW4gdGhpcyB0YWJsZSIpDQoNCg0KYGBgDQoNCiMjIyMgSW5zdGFuY2UgRG9jdW1lbnQgIA0KSW5zdGFuY2UgZG9jdW1lbnQgaXMgd2hlcmUgY3VycmVudCByZXBvcnQgZGF0YSBpcyByZXBvcnRlZCB1c2luZyBYQlJMIHN5bnRheCAoW3NlZSBzZWN0aW9uIDMuNy4zLjRdKCNpbnMtZG9jKSkuIEluIG91ciBleGFtcGxlIHdlIGNhbiBhbmFseXplIHRoZSBjb21wb25lbnRzIG9mIG91ciBpbnN0YW5jZSBkb2N1bWVudCBhcyBmb2xsb3dzOiAgDQoNCiMjIyMjIFJlZmVyZW5jZXMgIA0KSW4gb3VyIGV4YW1wbGUsIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBoYXMgb25seSBvbiByZWZlcmVuY2UgYDxzY2hlbWFSZWY+YCwgd2hpaCBpcyBhIG1hbmRhdG9yeSBlbGVtZW50IHRoYXQgbXVzdCBleGlzdCBhdGxlYXN0IG9uY2UgYXMgY2hpbGQgdG8gYDx4YnJsPmAgZWxlbWVudC4NCmBgYHtyIGV4YW1wbGVfaW5zdF9kb2MsIGVjaG89RkFMU0V9DQppbnN0IDwtIHhtbDI6OnJlYWRfeG1sKGhlcmU6OmhlcmUoJ3htbF9maWxlcy9pbmNvbWVTdGF0ZW1lbnRFeGFtcGxlJywnaW5zdGFuY2UueG1sJykpDQoNCnJlZnMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKGluc3QsJy4vLypbY29udGFpbnMobG9jYWwtbmFtZSgpLCAiUmVmIildJykgJT4lDQogIG1hcChmdW5jdGlvbih4KSB7DQogICAgYyh0YWc9eG1sMjo6eG1sX25hbWUoeCksIHhtbDI6OnhtbF9hdHRycyh4KSkNCiAgfSkgJT4lIGJpbmRfcm93cygpDQoNCmtuaXRyOjprYWJsZShyZWZzLCBlc2NhcGUgPSBGKSAlPiUgDQogIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSANCiAgaHRtbHRvb2xzOjpkaXYoc3R5bGU9Im92ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyIpDQoNCmBgYA0KDQojIyMjIyBjb250ZXh0cyANCkFzIG1lbnRpb25lZCwgYDxjb250ZXh0PmAgaXMgYW4gZWxlbWVudCB1c2VkIG9ubHkgaW4gWEJSTCBpbnN0YW5jZSBkb2N1bWVudCwgaXQgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3Igc29tZSBjb3JlIGRpbWVuc2lvbiBhbmQgdGF4b25vbXkgZGVmaW5lZCBkaW1lbnNpb25zLCBhbmQgaXQgaXMgcmVmZXJlbmNlZCBieSBmYWN0cyBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCB0byBnaXZlIGNvbnRleHR1YWwgbWVhbmluZyB0byB0aGUgZmFjdC4gIA0KDQpJbiBvdXIgZXhhbXBsZSwgZm9sbG93aW5nIGNvbnRleHRzIHdlcmUgZGVmaW5lZCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQ6DQpgYGB7ciBleGFtcGxlX2luc3RfY29udGV4dHMsIGVjaG89RkFMU0V9DQoNCmNvbnRleHRzIDwtIHhtbDI6OnhtbF9maW5kX2FsbChpbnN0LCcuLy8qW2xvY2FsLW5hbWUoKT0iY29udGV4dCJdJykgJT4lDQogIG1hcChmdW5jdGlvbih4KSB7DQogICAgYyh0YWc9eG1sMjo6eG1sX25hbWUoeCksIA0KICAgICAgaWQ9eG1sMjo6eG1sX2F0dHIoeCwgJ2lkJyksDQogICAgICBgRW50aXR5IElkZW50aWZpZXJgPSBhcy5jaGFyYWN0ZXIoeG1sMjo6eG1sX2ZpbmRfZmlyc3QoeCwgJy4vLypbbG9jYWwtbmFtZSgpPSJpZGVudGlmaWVyIl0vdGV4dCgpJykpLA0KICAgICAgYEVudGl0eSBJZGVudGlmaWVyIFNjaGVtYWA9YXMuY2hhcmFjdGVyKHhtbDI6OnhtbF9hdHRyKHhtbDI6OnhtbF9maW5kX2ZpcnN0KHgsICcuLy8qW2xvY2FsLW5hbWUoKT0iaWRlbnRpZmllciJdJyksICdzY2hlbWUnKSksDQogICAgICBgRW50aXR5IFNlZ21lbnQgRGltYD1hcy5jaGFyYWN0ZXIoeG1sMjo6eG1sX2F0dHIoeG1sMjo6eG1sX2ZpbmRfZmlyc3QoeCwgJy4vLypbbG9jYWwtbmFtZSgpPSJleHBsaWNpdE1lbWJlciJdJyksICdkaW1lbnNpb24nKSksDQogICAgICBgRW50aXR5IFNlZ21lbnQgTWVtYmVyYD1hcy5jaGFyYWN0ZXIoeG1sMjo6eG1sX2ZpbmRfZmlyc3QoeCwgJy4vLypbbG9jYWwtbmFtZSgpPSJleHBsaWNpdE1lbWJlciJdL3RleHQoKScpKSwNCiAgICAgIGBQZXJpb2Qgc3RhcnREYXRlYD1hcy5jaGFyYWN0ZXIoeG1sMjo6eG1sX2ZpbmRfZmlyc3QoeCwgJy4vLypbbG9jYWwtbmFtZSgpPSJzdGFydERhdGUiXS90ZXh0KCknKSksDQogICAgICBgUGVyaW9kIGVuZERhdGVgPWFzLmNoYXJhY3Rlcih4bWwyOjp4bWxfZmluZF9maXJzdCh4LCAnLi8vKltsb2NhbC1uYW1lKCk9ImVuZERhdGUiXS90ZXh0KCknKSksDQogICAgICBgUGVyaW9kIEluc3RhbnRgPWFzLmNoYXJhY3Rlcih4bWwyOjp4bWxfZmluZF9maXJzdCh4LCAnLi8vKltsb2NhbC1uYW1lKCk9Imluc3RhbnQiXS90ZXh0KCknKSkNCiAgICAgICkNCiAgfSkgJT4lIGJpbmRfcm93cygpDQoNCmtuaXRyOjprYWJsZShjb250ZXh0cywgZXNjYXBlID0gRikgJT4lIA0KICBrYWJsZUV4dHJhOjprYWJsZV9jbGFzc2ljKCkgJT4lIA0KICBodG1sdG9vbHM6OkhUTUwoKSAlPiUgDQogIGh0bWx0b29sczo6ZGl2KHN0eWxlPSJvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6IG5vd3JhcDsiKQ0KDQpgYGANCl9Ob3Rlc18gIA0KKiBFYWNoIGNvbnRleHQgbXVzdCBoYXZlIHVuaXF1ZSBJRC4gIA0KKiBFYWNoIGNvbnRleHQgbXVzdCBjb250YWluIG9uZSBgPGVudGl0eT5gIGVsZW1lbnQgdGhhdCBpZGVudGlmaWVzIHRoZSByZXBvcnRpbmcgZW50aXR5LCBgPGVudGl0eT5gIGVsZW1lbnQgbWF5IGNvbnRhaW4gYSBzZWdtZW50IGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIGEgZGltZW5zaW9uIGFuZCBhIGRvbWFpbiBtZW1iZXIgZm9yIGRpbWVuc2lvbmFsIHJlbGF0aW9ucy4gIA0KKiBFYWNoIGNvbnRleHQgbXVzdCBoYXZlIGEgYDxwZXJpb2Q+YCBlbGVtZW50IHRoYXQgaWRlbnRpZmllcyB0aGUgaW5zdGFudCBvciBkdXJhdGlvbiBmb3IgYSByZXBvcnRlZCBmYWN0LCBhbHNvIG5vdGUgdGhlcmUgaXMgYSBwZXJpb2QgdHlwZSBgZm9yZXZlcmAgdXNlZCBmb3IgZmFjdHMgdGhhdCBkbyBub3QgaGF2ZSBhIHNwZWNpZmljIHBlcmlvZCBkaW1lbnNpb24sIGZvciBleGFtcGxlLCB0aGUgbmFtZSBvZiB0aGUgZm91bmRlciBvZiBhIGNvbXBhbnkgY2FuIGJlIGEgZmFjdCB0aGF0IGRvZXMgbm90IGhhdmUgc3BlY2lmaWMgcGVyaW9kLiAgDQoNCiMjIyMjIFVuaXRzICANClhCUkwgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBhbGwgbnVtZXJpYyBmYWN0cyB0byBoYXZlIGEgdW5pdCBvZiBtZWFzdXJlbWVudCAoW3NlZSBYQlJMIHNwZWNpZmljYXRpb25zIHNlY3Rpb24gNC42LjJdKGh0dHBzOi8vd3d3Lnhicmwub3JnL1NwZWNpZmljYXRpb24vWEJSTC0yLjEvUkVDLTIwMDMtMTItMzEvWEJSTC0yLjEtUkVDLTIwMDMtMTItMzErY29ycmVjdGVkLWVycmF0YS0yMDEzLTAyLTIwLmh0bWwjXzQuNi4yKSkuIEluIG91ciBpbnN0YW5jZSBkb2N1bWVudCwgZm9sbG93aW5nIHVuaXRzIHdlcmUgZGVjbGFyZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBmYWN0czogIA0KYGBge3IgZXhhbXBsZV9pbnN0X3VuaXRzLCBlY2hvPUZBTFNFfQ0KDQp4dW5pdHMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKGluc3QsJy4vLypbbG9jYWwtbmFtZSgpPSJ1bml0Il0nKSAlPiUNCiAgICBtYXAoZnVuY3Rpb24oeCkgew0KICAgIGModGFnPXhtbDI6OnhtbF9uYW1lKHgpLCB4bWwyOjp4bWxfYXR0cnMoeCksIA0KICAgICAgbWVhc3VyZT1hcy5jaGFyYWN0ZXIoeG1sMjo6eG1sX2ZpbmRfZmlyc3QoeCwgJy4vKltsb2NhbC1uYW1lKCk9Im1lYXN1cmUiXS90ZXh0KCknKSksDQogICAgICBgRGl2aWRlIE51bWVyYXRvcmAgPSBhcy5jaGFyYWN0ZXIoeG1sX2ZpbmRfZmlyc3QoeCwgJy4vLypbbG9jYWwtbmFtZSgpPSJ1bml0TnVtZXJhdG9yIl0vKltsb2NhbC1uYW1lKCk9Im1lYXN1cmUiXS90ZXh0KCknKSksDQogICAgICBgRGl2aWRlIERlbm9taW5hdG9yYD1hcy5jaGFyYWN0ZXIoeG1sX2ZpbmRfZmlyc3QoeCwgJy4vLypbbG9jYWwtbmFtZSgpPSJ1bml0RGVub21pbmF0b3IiXS8qW2xvY2FsLW5hbWUoKT0ibWVhc3VyZSJdL3RleHQoKScpKQ0KICAgICAgDQogICAgICApDQogIH0pICU+JSBiaW5kX3Jvd3MoKQ0KDQprbml0cjo6a2FibGUoeHVuaXRzLCBlc2NhcGUgPSBGKSAlPiUgDQogIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSANCiAgaHRtbHRvb2xzOjpkaXYoc3R5bGU9Im92ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyIpDQoNCmBgYA0KX05vdGU6XyBUaGUgdW5pdCByZWZlcmVuY2VkIGJ5IGEgZmFjdCBuZWVkcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHRoZSB0eXBlIG9mIHRoYXQgZmFjdCwgZm9yIGV4YW1wbGUgYEVhcm5pbmdzUGVyU2hhcmVgIGNvbmNlcHQgd2lsbCB1c3VhbGx5IGhhdmUgYSBgcGVyU2hhcmVJdGVtVHlwZWAgYW5kIHRoZSB1bml0IHNob3VsZCBiZSBhIHBlciBzaGFyZSBhbHNvLiAgDQoNCiMjIyMjIEZhY3RzIA0KRGV0YWlscyBvZiBmYWN0cyBpbiB0aGUgaW5zdGFuY2UgaXMgYXMgZm9sbG93czogIA0KYGBge3IgZXhhbXBsZV9pbnN0X2ZhY3RzLCBlY2hvPUZBTFNFfQ0KZmFjdCA8LSAgeG1sMjo6eG1sX2ZpbmRfYWxsKGluc3QsJy4vKltub3QobG9jYWwtbmFtZSgpPSJ1bml0IiBvciBsb2NhbC1uYW1lKCk9ImNvbnRleHQiIG9yIGxvY2FsLW5hbWUoKT0ic2NoZW1hUmVmIiBvciBsb2NhbC1uYW1lKCk9ImZvb3Rub3RlTGluayIpXScpICU+JSANCiAgbWFwKGZ1bmN0aW9uKHgpIHsNCiAgICBjKHRhZz14bWwyOjp4bWxfbmFtZSh4KSwgeG1sMjo6eG1sX2F0dHJzKHgpLCB2YWx1ZT14bWwyOjp4bWxfdGV4dCh4KSkNCiAgfSkgJT4lIGJpbmRfcm93cygpDQoNCmtuaXRyOjprYWJsZShmYWN0LCBlc2NhcGUgPSBGKSAlPiUgDQogIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSANCiAgaHRtbHRvb2xzOjpkaXYoc3R5bGU9Im92ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyIpDQoNCmBgYA0KX05vdGVzIG9mIGZhY3QgYXR0cmlidXRlcyBgQGRlY2ltYWxgIGFuZCBgQHByZWNpc2lvbmA6XyAgDQoNCj5BIE51bWVyaWMgSXRlbSBNVVNUIGhhdmUgZWl0aGVyIGEgQHByZWNpc2lvbiBhdHRyaWJ1dGUgb3IgYSBAZGVjaW1hbHMgYXR0cmlidXRlIHVubGVzcyBpdCBpcyBvZiB0aGUgZnJhY3Rpb25JdGVtVHlwZSBvciBvZiBhIHR5cGUgdGhhdCBpcyBkZXJpdmVkIGJ5IHJlc3RyaWN0aW9uIGZyb20gZnJhY3Rpb25JdGVtVHlwZSBvciBoYXMgYSBuaWwgdmFsdWUsIGluIHdoaWNoIGNhc2UsIGl0IE1VU1QgTk9UIGhhdmUgZWl0aGVyIGEgQHByZWNpc2lvbiBhdHRyaWJ1dGUgb3IgYSBAZGVjaW1hbHMgYXR0cmlidXRlLiBgciB0dWZ0ZTo6cXVvdGVfZm9vdGVyKCctLS0gW1hCUkwgU3BlY2lmaWNhdGlvbnMgNC42LjNdKGh0dHBzOi8vd3d3Lnhicmwub3JnL1NwZWNpZmljYXRpb24vWEJSTC0yLjEvUkVDLTIwMDMtMTItMzEvWEJSTC0yLjEtUkVDLTIwMDMtMTItMzErY29ycmVjdGVkLWVycmF0YS0yMDEzLTAyLTIwLmh0bWwjXzQuNi4zKScpYCAgDQoNCiogYEBkZWNpbWFsYDogVGhpcyBhdHRyaWJ1dGUgTVVTVCBiZSBhbiBpbnRlZ2VyIG9yIHRoZSB2YWx1ZSAiSU5GIiB0aGF0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHdoaWNoIHRoZSB2YWx1ZSBvZiB0aGUgZmFjdCByZXByZXNlbnRlZCBtYXkgYmUgY29uc2lkZXJlZCBhY2N1cmF0ZSwgcG9zc2libHkgYXMgYSByZXN1bHQgb2Ygcm91bmRpbmcgb3IgdHJ1bmNhdGlvbiwgYSBuZWdhdGl2ZSBpbnRlZ2VyIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGlzIHRydW5jYXRlZCwgZm9yIGV4YW1wbGUgaWYgYEBkZWNpbWFsPS02YCB0aGVuIHRoZSB2YWx1ZSBpcyBpbiBNaWxsaW9ucy4gKFtTZWUgWEJSTCBTcGVjaWZpY2F0aW9ucyA0LjYuNV0oaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi9YQlJMLTIuMS9SRUMtMjAwMy0xMi0zMS9YQlJMLTIuMS1SRUMtMjAwMy0xMi0zMStjb3JyZWN0ZWQtZXJyYXRhLTIwMTMtMDItMjAuaHRtbCNfNC42LjUpKS4gIA0KKiBgQHByZWNpc2lvbmA6IFRoaXMgYXR0cmlidXRlIE1VU1QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBvciB0aGUgc3RyaW5nICJJTkYiIHRoYXQgY29udmV5cyB0aGUgYXJpdGhtZXRpYyBwcmVjaXNpb24gb2YgYSBtZWFzdXJlbWVudC4gSWYgYSBudW1lcmljIGZhY3QgaGFzIGEgQHByZWNpc2lvbiBhdHRyaWJ1dGUgdGhhdCBoYXMgdGhlIHZhbHVlICJuIiB0aGVuIGl0IGlzIGNvcnJlY3QgdG8gIm4iIHNpZ25pZmljYW50IGZpZ3VyZXMgKFtTZWUgWEJSTCBTcGVjaWZpY2F0aW9ucyA0LjYuNF0oaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi9YQlJMLTIuMS9SRUMtMjAwMy0xMi0zMS9YQlJMLTIuMS1SRUMtMjAwMy0xMi0zMStjb3JyZWN0ZWQtZXJyYXRhLTIwMTMtMDItMjAuaHRtbCNfNC42LjQpKS4gIA0KDQpbQWxzbyBzZWUgc3VwcG9ydCByZWNvbW1lbmRhdGlvbiBmb3IgcHJlY2lzaW9uIGFuZCBkZWNpbWFsXShodHRwczovL3d3dy54YnJsLm9yZy9XR04vcHJlY2lzaW9uLWRlY2ltYWxzLXVuaXRzL1dHTi0yMDE3LTAxLTExL3ByZWNpc2lvbi1kZWNpbWFscy11bml0cy1XR04tMjAxNy0wMS0xMS5odG1sKS4gDQoNCiMjIyBYQlJMIFZhbGlkYXRpb257I3hicmwtdmFsaWRhdGlvbn0gIA0KDQojIyMjIFZhbGlkYXRpb24gaW4gWEJSTCBTcGVjaWZpY2F0aW9uICANClhCUkwgU3BlY2lmaWNhdGlvbnMgcmVxdWlyZXMgdGhhdCBgWEJSTCBJbnN0YW5jZWAsIGBYQlJMIExpbmtiYXNlc2AgYW5kIGBYQlJMIFRheG9ub215IFNjaGVtYWAgbXVzdCBjb21wbHkgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbnMsIGFuZCB0aGlzIGNvbXBsaWFuY2UgaXMgZW5zdXJlZCB0aHJvdWdoIGBWYWxpZGF0aW9uIHByb2Nlc3NgIFhCUkwgW3NwZWNpZmljYXRpb25zIHNlY3Rpb24gMy40XShodHRwczovL3d3dy54YnJsLm9yZy9TcGVjaWZpY2F0aW9uL1hCUkwtMi4xL1JFQy0yMDAzLTEyLTMxL1hCUkwtMi4xLVJFQy0yMDAzLTEyLTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxMy0wMi0yMC5odG1sI18zLjQpLiANCg0KTWFueSBvZiBYQlJMIHN5bnRheCBpcyBleHByZXNzZWQgdXNpbmcgWE1MIFNjaGVtYSwgYXMgYSByZXN1bHQsIGEgcGFydCBvZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgWE1MIFNjaGVtYSB2YWxpZGF0aW9uLCBvdGhlciBwYXJ0cyBtdXN0IGJlIGhhbmRsZWQgYnkgb3RoZXIgdmFsaWRhdGlvbiB0ZWNobm9sb2dpZXMuICANCg0KIyMjIyBUd28gbGF5ZXJzIG9mIHZhbGlkYXRpb24NCkdlbmVyYWxseSBzcGVha2luZyB0aGVyZSBhcmUgdHdvIGxheWVycyBvZiB2YWxpZGF0aW9uLCBgQmFzaWMgVmFsaWRhdGlvbmAgYW5kIGBCdXNpbmVzcyBSdWxlcyB2YWxpZGF0aW9uYCBfKHRlcm1pbm9sb2d5IG1heSBkaWZmZXIgaGVyZSwgYnV0IG1lYW5pbmcgd2lsbCByZW1haW5zIHRoZSBzYW1lKV8uDQoNCiMjIyMjIEJhc2ljIFZhaWxkYXRpb24gIA0KQ2hlY2tzIGZvciBzeW50YXggYW5kIFhCUkwgc3BlY2lmaWNhdGlvbnMgcnVsZXMgY29tcGxpYW5jZSwgdGhlIGJhc2ljIHZhbGlkYXRpb24gcnVsZXMgd2lsbCBiZSB0aGUgc2FtZSBpbiBhbGwgc2l0dWF0aW9ucywgc2luY2UgaXQganVzdCBjaGVja2luZyBmb3IgY29tcGxpYW5jZSB3aXRoIFhCUkwgc3BlY2lmaWNhdGlvbnMuIEJhc2ljIHZhbGlkYXRpb24gaW5jbHVkZXMgbWFueSBmYWNldHMgYXMgZm9sbG93czogIA0KDQoqIGBTeW50YXggVmFsaWRhdGlvbmA6IENoZWNrcyBpZiB2YWxpZGl0eSBvZiBmb3JtYXQgYW5kIHZhbGlkaXR5IGFnYWluc3QgYSBzY2hlbWEuICANCiogYERhdGEgVHlwZSBWYWxpZGF0aW9uYDogY2hlY2tzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIGRhdGEgdHlwZSBvZiBpdHMgY29uY2VwdCBjb3JlIGRpbWVuc2lvbi4gRm9yIGV4YW1wbGUsIGVuc3VyaW5nIHRoYXQgc3RyaW5ncyBhcmUgbm90IHJlcG9ydGVkIGFnYWluc3QgY29uY2VwdHMgd2hpY2ggc2hvdWxkIHRha2UgbnVtZXJpYyB2YWx1ZXMuICANCiogYENvbmNlcHQgUmVsYXRpb25zaGlwLWJhc2VkIFZhbGlkYXRpb25gOiBUaGVzZSBhcmUgdmFsaWRhdGlvbiBiYXNlZCBvbiBYQlJMIGxpbmtzLCBhcyBkZXNjcmliZWQgaW4gX1RESCBzZWN0aW9uIDYuMS4zIHBhZ2UgODdfOiAgDQoNCj5UaGVzZSBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCByZWxhdGlvbnNoaXBzIGRlZmluZWQgYnkgY2FsY3VsYXRpb24sIGRlZmluaXRpb24sIGFuZCBwcmVzZW50YXRpb24gbGlua2Jhc2VzLiBUaGUgcmVsYXRpb25zaGlwIGFyY3MgY29ubmVjdGluZyBjb25jZXB0cyBjYW4gYWlkIGRldmVsb3BlcnMgKGFuZCBwcmVwYXJlcnMpIGluIGVuc3VyaW5nIGJvdGggdGhlIHNlbWFudGljIGxvZ2ljIG9mIHRoZSByZWxhdGlvbnNoaXAgYW5kIHRoYXQgdGhlIGNvbmNlcHRzIGludm9sdmVkIGFyZSB1c2VkIHByb3Blcmx5LmByIHR1ZnRlOjpxdW90ZV9mb290ZXIoJy0tLSBbVERIIHNlY3Rpb24gNi4xLjMgcGFnZSA4N10oaHR0cHM6Ly94YnJsdXMuZ2l0aHViLmlvL2RvY3MvdGRoLmh0bWwpJylgICANCg0KIyMjIyMgQnVzaW5lc3MgUnVsZXMgVmFsaWRhdGlvbg0KT24gdGhlIG90aGVyIGhhbmQgYEJ1c2luZXNzIFJ1bGVzIFZhbGlkYXRpb25gIGNoZWNrcyBmb3IgY29tcGxpYW5jZSB3aXRoIHJ1bGVzIHNwZWNpZmljIHRvIHRoZSB0YXhvbm9teSwgYW5kIHRob3NlIHdpbGwgZGlmZmVyIGRlcGVuZGluZyBvbiB0aGUgdGF4b25vbXkgYXV0aG9ycycgb2JqZWN0aXZlcyBhbmQgcnVsZXMuIFRoaXMgbWFrZXMgaXQgbmVjZXNzYXJ5IHRvIGNvbWUgdXAgd2l0aCBjdXN0b20gdmFsaWRhdGlvbnMgdGhhdCBjaGVja3MgZm9yIGNvbXBsaWFuY2Ugd2l0aCBzcGVjaWZpYyBidXNpbmVzcyBydWxlcy4gDQoNCkN1c3RvbSBydWxlIHZhbGlkYXRpb24gY2FuIGJlIGJ1aWx0IGludG8gdmFsaWRhdGlvbiBzb2Z0d2FyZSwgYXMgYW4gZXhhbXBsZSwgYEFyZWxsZWAgaGFzIG11bHRpcGxlIHBsdWdpbnMgdGhhdCB2YWxpZGF0ZXMgZGlmZmVyZW50IHNldHMgb2Ygc3BlY2lmaWMgYnVzaW5lc3MgcnVsZXMsIHN1Y2ggYXMgYEVkZ2FyIEZpbGluZyBNYW51YWwgKEVGTSlgIHJ1bGVzIChTRUMgcnVsZXMpLCBgSUZSU2AgcnVsZXMsIGBFdXJwZWFuIEJhbmtpbmcgQXV0aG9yaXR5IChFQkEpYCBydWxlcywgLi4uIGV0Yy4gDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbQXJlbGxlIFZhbGlkYXRpb24gT3B0aW9uc10oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMvYXJlbGxlRFNWYWxpZGF0aW9uLnBuZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqQXJlbGxlIFZhbGlkYXRpb24gT3B0aW9ucyoqDQo8L3A+DQo8L2Rpdj4NCg0KWEJSTCBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgdG9vbHMgdG8gaGVscCBpbiBzZXR0aW5nIGN1c3RvbSBydWxlcywgdGhlc2UgYXJlIGBYQlJMIEZvcm11bGFlYCwgYW5kIGBYVUxFYCAoW2Jhc2VkIG9uIFhCUkwgRm9ybXVsYSBzcGVjaWZpY2F0aW9uc10oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy93b3JrLXByb2R1Y3QtaW5kZXgtZm9ybXVsYS1mb3JtdWxhLTEuMC5odG1sKSkuDQoNCioqWEJSTCBGb3JtdWxhKiogIA0KWEJSTCBGb3JtdWxhIHNwZWNpZmljYXRpb25zIHByb3ZpZGUgWEJSTCBjb25zdHJ1Y3RzIHRoYXQgaW5zdHJ1Y3RzIFhCUkwgcHJvY2Vzc29yIHRvIHByZWZvcm0gY2VydGFpbiBwcm9jZWR1cmVzIG9uIGFuIFhCUkwgSW5zdGFuY2UuIFRESCBzZWN0aW9uIDYuMi4xIHBhZ2UgODggZGVzY3JpYmVzIFhCUkwgRm9ybXVsYSBhcyBmb2xsb3dzOiAgDQoNCj5YQlJMIGZvcm11bGFzIHByb3ZpZGUgYSBzdGFuZGFyZGl6ZWQgbWV0aG9kIGZvciBkZWZpbmluZyB2YWxpZGF0aW9uIHJ1bGVzIGZvciBYQlJMIHJlcG9ydHMgdGhhdCBnbyBiZXlvbmQgd2hhdCBpcyBwcm92aWRlZCB0aHJvdWdoIGNhbGN1bGF0aW9ucyBhbmQgb3RoZXIgY29uY2VwdCByZWxhdGlvbnNoaXBzLiBUaHJvdWdoIGZvcm11bGFzLCB0aGUgdmFsaWRhdGlvbiBydWxlcyBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIHRheG9ub215IGl0c2VsZi4gVGhpcyBhbGxvd3MgdGhlIHRheG9ub215IHRvIGJlIGVhc2lseSBkaXNzZW1pbmF0ZWQgd2l0aCBpdHMgdmFsaWRhdGlvbiBydWxlcywgd2hpY2ggcmVkdWNlcyB0aGUgY2hhbmNlIGZvciBwcmVwYXJlcnMgdG8gbWlzaW50ZXJwcmV0IHRoZW0gb3IgaGF2ZSBkaWZmaWN1bHR5IGxvY2F0aW5nIHRoZW0uIFhCUkwgZm9ybXVsYSBydWxlcyBhcmUgcGxhY2VkIGluIHRoZWlyIG93biBsaW5rYmFzZSwgb2Z0ZW4gdGVybWVkIHRoZSBhc3NlcnRpb24gb3IgZm9ybXVsYSBsaW5rYmFzZS4gWEJSTCBzb2Z0d2FyZSBjYXBhYmxlIG9mIHJlYWRpbmcgYW5kIGludGVycHJldGluZyB0aGlzIGxpbmtiYXNlIGNhbiBhcHBseSB0aGUgcnVsZXMgYW5kIGRpc3BsYXkgdGhlIHJlc3VsdHMgdG8gcHJlcGFyZXJzLmByIHR1ZnRlOjpxdW90ZV9mb290ZXIoJy0tLSBbVERIIHNlY3Rpb24gNi4yLjEgcGFnZSA4OF0oaHR0cHM6Ly94YnJsdXMuZ2l0aHViLmlvL2RvY3MvdGRoLmh0bWwpJylgIA0KDQpTbyBpbiBhZGRpdGlvbiB0byB0aGUgbGlua2Jhc2VzIHdlIHRhbGtlZCBhYm91dCBwcmV2aW91c2x5LCBhIHRheG9ub215IGNhbiBoYXZlIGEgYEZvcm11bGEgTGlua2Jhc2VgLiBYQlJMIGZvcm11bGEgY2FuIGRvIGZvdXIgdGhpbmdzIChmb3VyIHByb2Nlc3NpbmcgbW9kZWxzKTogIA0KDQoqIGBWYWx1ZSBhc3NlcnRpb25gOiBDaGVja3MgZmFjdCB2YXJpYWJsZSBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEsIGZvciBleGFtcGxlLCBDYXNoIGJhbGFuY2UgaXMgZ3JlYXRlciB0aGFuIHplcm8uICANCiogYEV4aXN0ZW5jZSBBc3NlcnRpb25gOiBDaGVja3MgZm9yIHRoZSBleGlzdGVuY2UgZm9yIHNwZWNpZmljIGZhY3QgZXhpc3QgaW4gYW4gWEJSTCBJbnN0YW5jZSwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlcmUgaXMgYSBydWxlIHRvIHJlcG9ydCBhIHNwZWNpZmljIGZhY3QsIHN1Y2ggYXMgY29tcGFueSBpZGVudGlmaWNhdGlvbiBudW1iZXIuICANCiogYEZvcm11bGFgOiBGb3JtdWxhZSBhcmUgY29uc3RydWN0cyBpbiBhIGZvcm11bGEgbGlua2Jhc2UgdGhhdCBjYXVzZSBwcm9kdWN0aW9uIG9mIGZhY3QgaXRlbXMsIGZvciBleGFtcGxlIGNhbGN1bGF0ZSBsaXF1aWRpdHkgcmF0aW8uIFRoaXMgdXNlZnVsIGluIGRhdGEgZXh0cmFjdGlvbiBmcm9tIGFuIGluc3RhbmNlIGRvY3VtZW50IGV2ZW4gdGhvdWdoIHRoaXMgaXMgbm90IHRoZSBpbnRlbmRlZCB1c2Ugb2YgZm9ybXVsYS4gIA0KKiBgQ29uc2lzdGVuY3kgQXNzZXJ0aW9uYDogQSBjb25zaXN0ZW5jeSBhc3NlcnRpb24gc3BlY2lmaWVzIGhvdyB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBvdXRwdXQgZmFjdCwgcHJvZHVjZWQgYnkgdGhlIGFzc29jaWF0ZWQgZm9ybXVsYSBtYXRjaGVzIHJlcG9ydGVkIGZhY3RzLCBmb3IgZXhhbXBsZSBpcyBMaWFiaWxpdGllcyBcJDEwIGFuZCBFcXVpdHkgaXMgXCQ1LCB3ZSBleHBlY3QgQXNzZXRzIHRvIGJlIFwkMTUgKGVxdWFsaXR5IGlzIGRldGVybWluZWQgd2l0aGluIGEgdG9sZXJhbmNlIG1hcmdpbikuICANCg0KW0ZpZ3VyZXMgMiBhbmQgMyBpbiBYQlJMIEZvcm11bGEgT3ZlcnZpZXddKGh0dHBzOi8vd3d3Lnhicmwub3JnL3dnbi94YnJsLWZvcm11bGEtb3ZlcnZpZXcvcHdkLTIwMTEtMTItMjEveGJybC1mb3JtdWxhLW92ZXJ2aWV3LXdnbi1wd2QtMjAxMS0xMi0yMS5odG1sI2ZpZ3VyZS1mb3JtdWxhLXByb2Nlc3NpbmctbW9kZWxzKSBzdW1tYXJpemVzIHRoZSBwcm9jZXNzaW5nIG1vZGVscyBhcyBmb2xsb3dzOiAgDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbRm91ciBwcm9jZXNzaW5nIG1vZGVscyBlZmZlY3RzXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9wcm9jZXNzaW5nLW1vZGVscy5wbmcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKkZvdXIgcHJvY2Vzc2luZyBtb2RlbHMgZWZmZWN0cyAqKltzb3VyY2UgWEJSTCBGb3JtdWxhIG92ZXJ2aWV3XShodHRwczovL3d3dy54YnJsLm9yZy93Z24veGJybC1mb3JtdWxhLW92ZXJ2aWV3L3B3ZC0yMDExLTEyLTIxL3hicmwtZm9ybXVsYS1vdmVydmlldy13Z24tcHdkLTIwMTEtMTItMjEuaHRtbCNmaWd1cmUtZm9ybXVsYS1wcm9jZXNzaW5nLW1vZGVscykNCjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxjZW50ZXI+DQohW0V4YW1wbGVzIGZvciBlYWNoIHByb2Nlc3NpbmcgbW9kZWxdKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL3Byb2Nlc3NpbmctbW9kZWwtZXhhbXBsZXMucG5nJylgKQ0KPC9jZW50ZXI+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KKipFeGFtcGxlcyBmb3IgZWFjaCBwcm9jZXNzaW5nIG1vZGVsICoqW3NvdXJjZSBYQlJMIEZvcm11bGEgb3ZlcnZpZXddKGh0dHBzOi8vd3d3Lnhicmwub3JnL3dnbi94YnJsLWZvcm11bGEtb3ZlcnZpZXcvcHdkLTIwMTEtMTItMjEveGJybC1mb3JtdWxhLW92ZXJ2aWV3LXdnbi1wd2QtMjAxMS0xMi0yMS5odG1sI2ZpZ3VyZS1mb3JtdWxhLXByb2Nlc3NpbmctbW9kZWxzKQ0KPC9wPg0KPC9kaXY+DQoNCmBJRlJTIFRheG9ub215YCBpcyBhbiBleGFtcGxlIG9mIGEgdGF4b25vbXkgdGhhdCB1c2VzIGZvcm11bGEgdG8gdmFsaWRhdGUgY3VzdG9tIHJ1bGVzIGZvciBYQlJMIGZpbGluZ3MgYmFzZWQgb24gdGhlIElGUlMgVGF4b25vbXkuIFtJRlJTIGZvcm11bGEgbGlua2Jhc2UgZ3VpZGUgZm91bmQgaGVyZV0oaHR0cHM6Ly93d3cuaWZycy5vcmcvY29udGVudC9kYW0vaWZycy9zdGFuZGFyZHMvdGF4b25vbXkvZ2VuZXJhbC1yZXNvdXJjZXMvZm9ybXVsYS1kb2N1bWVudGF0aW9uLTIwMjAucGRmKS4gIA0KDQoqKlhVTEUqKiAgDQpYVUxFIGlzIGFuIGV4cHJlc3Npb24gc3ludGF4IHRoYXQgYWxsb3dzIHRoZSBxdWVyeWluZyBvZiBYQlJMIHJlcG9ydHMgYW5kIHRheG9ub21pZXMgdXNpbmcgYSBYVUxFIHByb2Nlc3NvciwgaXQgaXMgZGVzY3JpYmVkIGluICoqW1RESCBzZWN0aW9uIDYuMi4yIHBhZ2UgOTldKiogYXMgZm9sbG93czogIA0KDQo+RGV2ZWxvcGVkIGJ5IFhCUkwgVVMsIFhVTEUgaXMgYW4gZXhwcmVzc2lvbiBzeW50YXggdGhhdCBhbGxvd3MgdGhlIHF1ZXJ5aW5nIG9mIFhCUkwgcmVwb3J0cyBhbmQgdGF4b25vbWllcyB1c2luZyBhIFhVTEUgcHJvY2Vzc29yLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIFhVTEUgaXMgdG8gcHJvdmlkZSBhIHVzZXItZnJpZW5kbHkgc3ludGF4IHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlIFhCUkwgZGF0YS4gVGhpcyBjYW4gYmUgaGVscGZ1bCBpbiBhIG11bHRpdHVkZSBvZiB3YXlzLCBpbmNsdWRpbmcgYWlkaW5nIGNvbnN1bWVycyBpbiBxdWlja2x5IGV4dHJhY3Rpbmcgc3BlY2lmaWMgZmFjdHMgZnJvbSByZXBvcnRzIGFuZCBzdXBwb3J0aW5nIGRldmVsb3BlcnMgaW4gcXVlcnlpbmcgWEJSTCB0YXhvbm9taWVzIHRvIHJlbmRlciB0aGVtIGFzIG9wZW4gQVBJIHNjaGVtYXMgb3IgYXMgaVhCUkwgZm9ybXMuYHIgdHVmdGU6OnF1b3RlX2Zvb3RlcignLS0tIFtUREggc2VjdGlvbiA2LjIuMiBwYWdlIDk5XShodHRwczovL3hicmx1cy5naXRodWIuaW8vZG9jcy90ZGguaHRtbCknKWAgIA0KDQpFeGFtcGxlIG9mIHRoZSBzeW50YXggZm9yIGBYVUxFYDoNCmBgYGMrKw0KbmFtZXNwYWNlIGh0dHA6Ly94eXouYWJjL0luY29tZVN0YXRlbWVudEV4YW1wbGUNCg0KLy8gQ2FsY3VsYXRlIGdyb3NzIG1hcmdpbiBieSBkaW1lbnNpb24NCm91dHB1dCBncm9zcy1tYXJnaW4NCiRncm9zcy1wcm9maXQ9QEdyb3NzUHJvZml0Q29uY2VwdA0KJHJldmVudWUgPSBAUmV2ZW51ZUNvbmNlcHQNCiRkaW1zID0gJHJldmVudWUuZGltZW5zaW9ucy1leHBsaWNpdA0KJGxhYiA9IGlmIChsZW5ndGgoJGRpbXMudmFsdWVzLmxhYmVsKE5vbmUsJ2VuJykudGV4dCk+MCkNCgkJICgkZGltcy52YWx1ZXMubGFiZWwoTm9uZSwnZW4nKS50ZXh0KVsxXQ0KCQllbHNlICJUb3RhbCINCgkJDQovLyBQcmludCBvdXRwdXQNCiJHcm9zcyBNYXJnaW4gZm9yIHskcmV2ZW51ZS5wZXJpb2R9IHskbGFifSA9IHtyb3VuZCggJGdyb3NzLXByb2ZpdCAvICRyZXZlbnVlLCAzICl9JSINCg0KLy8gUXVlcnkgYWxsIGZhY3RzIHdpdGggdmFsdWUgbW9yZSB0aGFuIEVHUCAyMDAwDQpvdXRwdXQgYmlnLWZhY3RzDQp7QGNvbmNlcHQgd2hlcmUgJGZhY3QgPiAyMDAwfQ0KYGBgDQoNCltGdWxsIGd1aWRlIGZvciBYVUxFIGlzIGF2YWlsYWJsZSBoZXJlXShodHRwczovL3hicmwudXMvd3AtY29udGVudC91cGxvYWRzLzIwMTkvMTAvWHVsZVYxLjEucGRmKS4gIA0KDQoNCiMjIyBYQlJMIFRhYmxlIExpbmtiYXNlICANClhCUkwgW1RhYmxlIExpbmtiYXNlIHNwZWNpZmljYXRpb25zXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtdGFibGUtbGlua2Jhc2UuaHRtbCkgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHRheG9ub215IGF1dGhvcnMgdG8gZGVmaW5lIGEgdGFidWxhciBsYXlvdXQgb2YgZmFjdHMuIFRoZSByZXN1bHRpbmcgdGFibGVzIGNhbiBiZSB1c2VkIGZvciBib3RoIHByZXNlbnRhdGlvbiBhbmQgZGF0YSBlbnRyeS4gIA0KDQpUYWJsZSBsaW5rYmFzZSBpcyBsb2dpY2FsbHkgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTGlua2Jhc2UgYnV0IHdpdGggYSBsb3QgbW9yZSBmZWF0dXJlcy4gSXQgYWxsb3dzIGZvciBhIHN0YW5kYXJkIHdheSBmb3IgZGVmaW5pbmcgdmlld3Mgb2YgY29uY2VwdHMgZGVmaW5lZCBpbiBhIHRheG9ub215LCBhcyBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gb3ZlcnZpZTogDQoNCj5UYWJsZSBsaW5rYmFzZSBlbmFibGVzIHRoZSBkZWZpbml0aW9uIG9mIHRhYmxlcyB3aXRoIG11bHRpcGxlIGF4ZXMuIFRoZSBjb21wb25lbnRzIG9mIHRoZXNlIGF4ZXMgYXJlIG5vdCBsaW1pdGVkIHRvIGluZGl2aWR1YWwgaXRlbXM7IGluc3RlYWQsIHRoZXkgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YgYSBjb21iaW5hdGlvbiBvZiBkaW1lbnNpb25zLCB0aW1lIHBlcmlvZCByZWZlcmVuY2VzLCB1bml0cywgZW50aXRpZXMgb3IgYW55IG90aGVyIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZpbmFuY2lhbCBmYWN0cyByZXByZXNlbnRlZCBieSB0YXhvbm9taWVzLmByIHR1ZnRlOjpxdW90ZV9mb290ZXIoJy0tLSBbWEJSTCBUYWJsZSBMaW5rYmFzZSBPdmVydmlld10oaHR0cHM6Ly93d3cueGJybC5vcmcvd2duL3RhYmxlLWxpbmtiYXNlLW92ZXJ2aWV3L3dnbi0yMDE0LTAzLTE4L3RhYmxlLWxpbmtiYXNlLW92ZXJ2aWV3LXdnbi0yMDE0LTAzLTE4Lmh0bWwjaW50cm9kdWN0aW9uKScpYCAgDQoNCiMjIyMgVGFibGUgTW9kZWxzICANClRhYmxlIGxpbmtiYXNlIHNwZWNpZmljYXRpb25zIGRlZmluZSAzIG1vZGVscyBgU3RydWN0dXJhbCBNb2RlbGAsIGBEZWZpbml0aW9uIE1vZGVsYCBhbmQgYGxheW91dCBtb2RlbGAuYERlZmluaXRpb24gTW9kZWxgIGRlZmluZXMgdGhlIGNvbnRlbnQgb2YgYSB0YWJsZSBpbiB0ZXJtcyBvZiBjb25jZXB0cyBhbmQgYXNwZWN0cyB1c2luZyByZWxhdGlvbnNoaXBzIGluIERUUywgaXQgaXMgdHJhbnNmb3JtZWQgdG8gU3RydWN0dXJhbCBtb2RlbCB0aHJvdWdoIHByb2Nlc3Mgb2YgYHJlc29sdXRpb25gLCB0aGUgc3ludGF4IHByb3ZpZGVzIGEgZGlyZWN0IGRlc2NyaXB0aW9uIG9mIHRoZSBkZWZpbml0aW9uIG1vZGVsLiBgU3RydWN0dXJhbCBNb2RlbGAgZGVmaW5lcyBob3cgdGhlIHRoZSBzaGFwZSBvZiB0aGUgdGFibGUgaW4gdGVybXMgb2YgaGllcmFyY2hpY2FsIGJyZWFrZG93bnMgb2YgZmFjdCBzcGFjZSwgd2hpbGUgIGBsYXlvdXQgTW9kZWxgIGlzIHRoZSBkaXJlY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgY29udGVudC4gDQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtUYWJsZSBNb2RlbHNdKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL3RhYmxlLW1vZGVscy5wbmcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKlRhYmxlIE1vZGVscyAqKlsoU291cmNlOiBUYWJsZSBMaW5rYmFzZSBPdmVydmlldyAxLjApXShodHRwczovL3d3dy54YnJsLm9yZy93Z24vdGFibGUtbGlua2Jhc2Utb3ZlcnZpZXcvd2duLTIwMTQtMDMtMTgvdGFibGUtbGlua2Jhc2Utb3ZlcnZpZXctd2duLTIwMTQtMDMtMTguaHRtbCNmaWd1cmUtbW9kZWxzKQ0KPC9wPg0KPC9kaXY+DQoNClRoZSBiYXNpYyBpZGVhIG9mIFhCUkwgVGFibGUgaXMgdGhhdCBpdCBmaWx0ZXJzIGFuZCBwcmVzZW50cyBmYWN0cyBpbiBzcGVjaWZpYyBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBkZWZpbml0aW9uIGFuZCBzdHJ1Y3R1cmUuIA0KDQpUZXJtcyByZWxldmFudCBmb3IgdGhlIFhCUkwgdGFibGUgbGlua2Jhc2U6ICANCg0KYEZhY3QgU291cmNlYDogQSBmYWN0IHNvdXJjZSBpcyBhIGNvbnRhaW5lciBmb3IgWEJSTCBmYWN0cywgZm9yIGV4YW1wbGUgaXQgbWF5YmUgYW4gZXhpc3RpbmcgWEJSTCBpbnN0YW5jZS4gRmFjdCBzb3VyY2Ugb2YgZmFjdHMgdGhhdCBhcmUgdG8gYmUgY29uc2lkZXJlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSB0YWJsZS4gIA0KDQpgRG9tYWluIG9mIGEgVGFibGVgOiBJcyB0aGUgcmVzdHJpY3RlZCBmYWN0IHNwYWNlIGRlZmluZWQgYnkgdGhlIGNvbWJpbmF0aW9uIG9mIGNvbnN0cmFpbnRzIGZyb20gYWxsIG9mIHRoZSB0YWJsZSdzIGJyZWFrZG93bnMsIGFsb25nIHdpdGggYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGNvbnN0cmFpbnRzIHNwZWNpZmllZCB1c2luZyB0YWJsZSBmaWx0ZXJzLg0KDQpgQXhpc2A6IEFuIGF4aXMgZGVmaW5lcyBhbiBvcmRlcmVkIG1hcHBpbmcgb2YgWEJSTCBmYWN0IHNwYWNlIG9udG8gYSBsaW5lLiAgDQoNCiAgKiBUaGUgeC1heGlzIFNIT1VMRCBiZSBpbnRlcnByZXRlZCBhcyBhIGhvcml6b250YWwgYXJyYW5nZW1lbnQgb2YgY29sdW1ucyBpbiBhIHRhYmxlLiBDb2x1bW5zIE1BWSBiZSBsYWlkIG91dCBmcm9tIGxlZnQgdG8gcmlnaHQsIG9yIHJpZ2h0IHRvIGxlZnQsIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UgY29udmVudGlvbnMuICANCiAgKiBUaGUgeS1heGlzIFNIT1VMRCBiZSBpbnRlcnByZXRlZCBhcyBhIHZlcnRpY2FsIHByb2dyZXNzaW9uIG9mIHJvd3MgaW4gYSB0YWJsZS4gUm93cyBTSE9VTEQgYmUgbGFpZCBvdXQgZnJvbSB0b3AgdG8gYm90dG9tLiAgDQogICogVGhlIHotYXhpcyBNQVkgYmUgaW50ZXJwcmV0ZWQgYXMgbXVsdGlwbGUgdHdvLWRpbWVuc2lvbmFsIHRhYmxlcyBhbmQgTUFZIGJlIGxhaWQgb3V0IG9uIGEgdHdvLWRpbWVuc2lvbmFsIGRpc3BsYXkgYnkgcHJlc2VudGluZyBlYWNoIHRhYmxlIGluIHNlcmllcyBvciBieSBzdXBwbHlpbmcgY29udHJvbHMgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgZGF0YSB0byBiZSBwcmVzZW50ZWQuICANCg0KYEJyZWFrZG93bmA6IEEgYnJlYWtkb3duIGRlZmluZXMgYSBsb2dpY2FsbHkgZGlzdGluY3QgYnJlYWtkb3duIG9mIHRoZSBmYWN0IHNwYWNlIGJ5IHNldHMgb2YgY29uc3RyYWludHMuIEEgYnJlYWtkb3duIGlzIG1vZGVsZWQgYXMgYW4gb3JkZXJlZCB0cmVlIG9mIGBzdHJ1Y3R1cmFsIG5vZGVzYC4gRWFjaCBvZiB0aGVzZSBub2RlcyBjb250cmlidXRlcyB6ZXJvIG9yIG1vcmUgY29uc3RyYWludHMgdG8gdGhlIGJyZWFrZG93bi4gIA0KDQogICogQSBjbG9zZWQgYnJlYWtkb3duIGlzIGRlZmluZWQgYXMgYSBicmVha2Rvd24gd2hvc2Ugc2VxdWVuY2Ugb2YgY29uc3RyYWludCBzZXRzIGNhbiBiZSBkZXRlcm1pbmVkIGluZGVwZW5kZW50bHkgb2YgdGhlIGZhY3RzIHRvIGJlIGluY2x1ZGVkLiAgDQogICogQW4gb3BlbiBicmVha2Rvd24gaXMgZGVmaW5lZCBhcyBhIGJyZWFrZG93biB3aG9zZSBzZXF1ZW5jZSBvZiBjb25zdHJhaW50IHNldHMgY2hhbmdlcyBkeW5hbWljYWxseSB3aXRoIHRoZSBmYWN0cyBpbmNsdWRlZCBhbmQgdGh1cyBjYW5ub3QgYmUgY29tcGxldGVseSBkZXRlcm1pbmVkIHdpdGhvdXQga25vd2xlZGdlIG9mIHRob3NlIGZhY3RzLiAgDQogIA0KYFN0cnVjdHVyYWwgTm9kZWA6IEEgc3RydWN0dXJhbCBub2RlIGlzIGEgbm9kZSBpbiBhIGJyZWFrZG93biB0cmVlLiBFYWNoIG5vZGUgY29udHJpYnV0ZXMgemVybyBvciBtb3JlIGNvbnN0cmFpbnRzIHRvIHRoZSBicmVha2Rvd24uICANCg0KICAqIEEgY2xvc2VkIHN0cnVjdHVyYWwgbm9kZSBpcyBhIHN0cnVjdHVyYWwgbm9kZSB3aXRoIGNvbnN0cmFpbnRzIGZ1bGx5IGRldGVybWluZWQgYnkgaXRzIGRlZmluaXRpb24gYW5kIHRoZSBEVFMuICANCiAgKiBBbiBvcGVuIHN0cnVjdHVyYWwgbm9kZSBpcyBhIHN0cnVjdHVyYWwgbm9kZSB0aGF0IGRvZXMgbm90IGZ1bGx5IGRlZmluZSBhc3BlY3QgdmFsdWUgY29uc3RyYWludHMgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aXRoIGxheW91dCBub2RlcyBwcm9kdWNlZCBkdXJpbmcgcmVzb2x1dGlvbi4NCg0KYERlZmluaXRpb24gbm9kZWA6IEEgZGVmaW5pdGlvbiBub2RlIGlzIGEgZGVmaW5pdGlvbiBvZiB6ZXJvIG9yIG1vcmUgc3RydWN0dXJhbCBub2RlcyBpbiB0aGUgc3RydWN0dXJhbCBtb2RlbC4gIA0KDQogICogQSBjbG9zZWQgZGVmaW5pdGlvbiBub2RlIGlzIGEgZGVmaW5pdGlvbiBub2RlIHdoaWNoIHJlc29sdmVzIHRvIG9uZSBvciBtb3JlIGNsb3NlZCBzdHJ1Y3R1cmFsIG5vZGVzLiAgDQogICogQW4gb3BlbiBkZWZpbml0aW9uIG5vZGUgaXMgYSBkZWZpbml0aW9uIG5vZGUgd2hpY2ggcmVzb2x2ZXMgdG8gYW4gb3BlbiBzdHJ1Y3R1cmFsIG5vZGUuICANCiAgDQpgVGFibGVgOiByZXByZXNlbnRzIGEgYnJlYWtkb3duIG9mIFhCUkwgZmFjdCBzcGFjZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVmaW5pbmcgYSByZWZlcmVuY2UgdmlldyBvZiBYQlJMIGRhdGEuICANCg0KICAqIEEgY2xvc2VkIHRhYmxlIGlzIGRlZmluZWQgYXMgYSB0YWJsZSB0aGF0IGNvbnNpc3RzIG9ubHkgb2YgY2xvc2VkIGJyZWFrZG93bnMuICANCiAgKiBBbiBvcGVuIHRhYmxlIGlzIGRlZmluZWQgYXMgYSB0YWJsZSB3aG9zZSBjb25zdGl0dWVudCBicmVha2Rvd25zIGluY2x1ZGUgYXQgbGVhc3Qgb25lIG9wZW4gYnJlYWtkb3duLiAgDQogIA0KIyMjIyBUYWJsZSBsaW5rYmFzZSBjb21wb25lbnRzIA0KVGFibGUgbGlua2Jhc2UgZGVmaW5lIGEgdGFibGUgaW4gdGVybXMgb2YgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0YWJsZSBsaW5rYmFzZS4gVGFibGUgbGlua2Jhc2UgdXNlcyBgZ2VuZXJpYyBsaW5rYCBhcyB0aGUgY29udGFpbmVyIGxpbmssIHdpdGhpbiB0aGUgZ2VuZXJpYyBsaW5rLCBhIHRhYmxlIGlzIGRlZmluZWQgdXNpbmcgcmVsYXRpb25zaGlwcyBgYXJjc2AgYW5kIGVsZW1lbnRzIGRlZmluZWQgaW4gdGFibGUgbGlua2Jhc2UuICANCg0KVGhlIG1haW4gbG9naWMgb2YgdGFibGUgbGlua2Jhc2UsIHVzaW5nIGxpbmsgc3ludGF4LCBpdCBjcmVhdGVzIGEgdGFibGUsIHRoZW4gbGlua3MgdGhhdCB0YWJsZSBhbiB4IChyb3dzKSBhbmQgeSAoY29sdW1ucykgYXhlcywgZWFjaCBheGlzIGl0IHRoZW4gbGlua2VkIHRvIGEgYnJlYWtkb3duIGVsZW1lbnQsIHdoaWNoIGFjdHMgYSBhIGNvbnRhaW5lciBmb3IgZmlsdGVyIGVsZW1lbnRzIHRoYXQgZmlsdGVycyB0aGUgZmFjdHMgdG8gYmUgc2hvd24gaW4gdGhlIHRhYmxlLiBUaGlzIGxvZ2ljIGNhbiBiZSB2aXN1YWxpemVkIGFzIGZvbGxvd3M6ICANCg0KDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbVGFibGUgRGVmaW5pdGlvbiBNb2RlbF0oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMvZGVmaW5pdGlvbi1tb2RlbC5wbmcnKWApDQo8L2NlbnRlcj4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQoqKlRhYmxlIERlZmluaXRpb24gTW9kZWwgKipbKFNvdXJjZTogVGFibGUgTGlua2Jhc2UgU3BlY2lmaWNhdGlvbnMgMS4wKV0oaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi90YWJsZS1saW5rYmFzZS9SRUMtMjAxNC0wMy0xOCtlcnJhdGEtMjAxOC0wNy0xNy90YWJsZS1saW5rYmFzZS1SRUMtMjAxNC0wMy0xOCtjb3JyZWN0ZWQtZXJyYXRhLTIwMTgtMDctMTcuaHRtbCNmaWd1cmUteGJybC1kZWZpbml0aW9uLW1vZGVsKQ0KPC9wPg0KPC9kaXY+DQoNCg0KRm9sbG93aW5nIGlzIGEgdGFibGUgbGlua2Jhc2UgdGhhdCBjcmVhdGVzIGEgdGFibGUgZnJvbSB0aGUgSW5jb21lIFN0YXRlbWVudCBleGFtcGxlLCB0aGUgdGFibGUgbWVtaWNzIGV4YWN0bHkgdGhlIGluY29tZSBzdGF0ZW1lbnQ6IA0KYGBge3IgdGFiX2xiLCBlY2hvPUZBTFNFfSANCmZuX0NvZGVDaHVua091dChsYW5nID0gJ1hNTCcsIEZpbGUgPSBoZXJlOjpoZXJlKCd4bWxfZmlsZXMnLCAnaW5jb21lU3RhdGVtZW50RXhhbXBsZS9pc190YWIueG1sJykpDQpgYGANCg0KV2hlbiB0aGUgYGluY29tZSBzdGF0ZW1lbnQgaW5zdGFuY2VgIGlzIGxvYWRlZCBieSBhcmVsbGUgYW5kIGEgdGFibGUgaXMgcmVuZGVyZWQgYXMgSFRNTCwgaXQgdGhlIG91dHB1dCBpcyBbaGVyZV0oLi4veG1sX2ZpbGVzL2luY29tZVN0YXRlbWVudEV4YW1wbGUvb3V0cHV0LXRhYmxlLmh0bWwpe3RhcmdldD1fYmxhbmt9LiAgDQoNCiMjIyBJbmxpbmUgWEJSTCAoaVhCUkwpICANCg0KW0lubGluZSBYQlJMIHNwZWNpZmljYXRpb25zXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtaW5saW5lLXhicmwuaHRtbCkgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgZW1iZWRkaW5nIFhCUkwgdGFncyBpbiBIVE1MIGRvY3VtZW50cyAoeEhUTUwgaXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zKS4gVGhpcyBhbGxvd3MgdGhlIFhCUkwgYmVuZWZpdHMgb2YgdGFnZ2VkIGRhdGEgdG8gYmUgY29tYmluZWQgd2l0aCBhIGh1bWFuLXJlYWRhYmxlIHByZXNlbnRhdGlvbiBvZiBhIHJlcG9ydCwgd2hpY2ggaXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHByZXBhcmVyLiANCg0KVGhlIElubGluZSBYQlJMIGBEb2N1bWVudCBTZXRgIGlzIGEgZ3JvdXAgb2Ygb25lIG9yIG1vcmUgSW5saW5lIFhCUkwgRG9jdW1lbnRzIHdoaWNoIHdoZW4gY29tcHJpc2luZyBzdWZmaWNpZW50IG1ldGFkYXRhIHJlc3VsdHMgaW4gb25lIG9yIG1vcmUgVGFyZ2V0IERvY3VtZW50cyB3aGVuIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgbWFwcGluZyBydWxlcyBwcmVzY3JpYmVkIGluIGlubGluZVhCUkwgc3BlY2lmaWNhdGlvbnMuDQoNCkluIHByYWN0aWNhbCB0ZXJtcywgaW5saW5lIFhCUkwgc3BlY2lmaWNhdGlvbnMgZGVmaW5lIFhCUkwgZWxlbWVudHMgaW4gdGhlIG5hbWVzcGFjZSBge2h0dHA6Ly93d3cueGJybC5vcmcvMjAxMy9pbmxpbmVYQlJMfWAsIHRoZXNlIGVsZW1lbnRzIGFyZSB1c2VkIGZyb20gd2l0aGluIHhIVE1MIGFuZCBmb3JtIHRoZSBtZXRhZGF0YSBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgYW4gWEJSTCBpbnN0YW5jZSBkb2N1bWVudCB3aGljaCBpcyByZWZlcnJlZCB0byBhcyBgVGFyZ2V0IERvY3VtZW50YCwgaW4gdGhpcyBjb250ZXh0IGEgYFRhcmdldCBEb2N1bWVudGAgaXMgZGVmaW5lZCBhcyBgdmFsaWQgWEJSTCBpbnN0YW5jZSBkb2N1bWVudCByZXByZXNlbnRlZCBieSBtZXRhZGF0YSBpbiB0aGUgSW5saW5lIFhCUkwgRG9jdW1lbnQgU2V0YC4gVGhlIHRhcmdldCBkb2N1bWVudCBuZWVkIG5vdCB0byBwaHlzaWNhbGx5IGV4aXN0LCBidXQgdGhlIG1ldGFkYXRhIG11c3QgYmUgc3VmZmljaWVudCB0byBjb25zdHJ1Y3QgdGhlIHRhcmdldCBkb2N1bWVudCB3aGVuIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgbWFwcGluZyBydWxlcyBwcmVzY3JpYmVkIGluIGlubGluZSBYQlJMIFNwZWNpZmljYXRpb24uIA0KDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbSW5saW5lIFhCUkxdKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL2lubGluZVhCUkwucG5nJylgKQ0KPC9jZW50ZXI+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KKipJbmxpbmUgWEJSTCoqDQo8L3A+DQo8L2Rpdj4NCg0KIyMjIyBJbmxpbmUgWEJSTCBlbGVtZW50cyAgDQpBcyBtZW50aW9uZWQsIFhCUkwgYW5kIElubGluZSBYQlJMIGluc3RhbmNlIGRvY3VtZW50cyBhcmUgdXN1YWxseSBjcmVhdGVkIHVzaW5nIHNwZWNpYWxpemVkIHNvZnR3YXJlIHRoYXQgdGFrZXMgY2FyZSBvZiB0aGUgZm9ybSBhbmQgc3l0YW54IGFuZCBwcm92aWRlIHRvb2xzIHRvIGhlbHAgYXV0aG9ycywgYnV0IGl0IGlzIGltcG9ydGFudCB0byBoYXZlIHNvbWUga25vd2xlZGdlIG9mIHRoZSBlbGVtZW50cyBkZWZpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWNhdGlvbnMuDQoNCklubGluZSBYQlJMIHNwZWNpZmljYXRpb25zIGRlZmluZSBlbGVtZW50cyBpbiBuYW1lc3BhY2UgYHt4aT1odHRwOi8vd3d3Lnhicmwub3JnLzIwMTMvaW5saW5lWEJSTH1gOg0KYGBge3IgaXhicmxfZWxlbWVudHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KZGF0YS5mcmFtZSgNCiAgZWxlbWVudD1jKCJpeDpjb250aW51YXRpb24iLA0KICAgICAgICAgICAgIml4OmRlbm9taW5hdG9yIiwNCiAgICAgICAgICAgICJpeDpleGNsdWRlIiwNCiAgICAgICAgICAgICJpeDpmb290bm90ZSIsDQogICAgICAgICAgICAiaXg6ZnJhY3Rpb24iLA0KICAgICAgICAgICAgIml4OmhlYWRlciIsDQogICAgICAgICAgICAiaXg6aGlkZGVuIiwNCiAgICAgICAgICAgICJpeDpub25GcmFjdGlvbiIsDQogICAgICAgICAgICAiaXg6bm9uTnVtZXJpYyIsDQogICAgICAgICAgICAiaXg6bnVtZXJhdG9yIiwNCiAgICAgICAgICAgICJpeDpyZWZlcmVuY2VzIiwNCiAgICAgICAgICAgICJpeDpyZWxhdGlvbnNoaXAiLA0KICAgICAgICAgICAgIml4OnJlc291cmNlcyIsDQogICAgICAgICAgICAiaXg6dHVwbGUiKSwNCiAgZGVzY3JpcHRpb249YygNCiAgICAndXNlZCB0byBkZWZpbmUgZGF0YSB0aGF0IGlzIHRvIGJlIHRyZWF0ZWQgYXMgcGFydCBvZiBpeDpmb290bm90ZSBvciBpeDpub25OdW1lcmljLicsDQogICAgJ2Rlbm90ZXMgYW4gWEJSTCBkZW5vbWluYXRvciBlbGVtZW50OyB1c2VkIHdpdGggaXg6ZnJhY3Rpb24gbWFwcGVkIGVsZW1lbnQuIHNlZSBpeDpmcmFjdGlvbicsDQogICAgJ3VzZWQgdG8gZW5jYXBzdWxhdGUgZGF0YSB0aGF0IGlzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHByb2Nlc3Npbmcgb2YgaXg6Zm9vdG5vdGUgb3IgaXg6bm9uTnVtZXJpYyBlbGVtZW50cywgVGhlIHB1cnBvc2Ugb2YgdGhlIGl4OmV4Y2x1ZGUgZWxlbWVudCBpcyB0byBwcmV2ZW50IHRleHQgY29udGVudCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSB7dmFsdWV9IHByb3BlcnRpZXMgb2YgaXg6Zm9vdG5vdGUgb3IgaXg6bm9uTnVtZXJpYy4gSXQgaGFzIG5vIG90aGVyIHVzZS4nLA0KICAgICdyZXByZXNlbnRzIHRoZSBsaW5rOmZvb3Rub3RlIGVsZW1lbnQgaW4gWEJSTCBpbnN0YW5jZSwnLA0KICAgICdkZW5vdGVzIGFuIFhCUkwgZmFjdCB3aGljaCBpcyBhbiBlbGVtZW50IG9mIHR5cGUsIG9yIGRlcml2ZWQgZnJvbSB0eXBlLCBmcmFjdGlvbkl0ZW1UeXBlOycsDQogICAgJ2NvbnRhaW5zIHRoZSBub24tZGlzcGxheWVkIHBvcnRpb25zIG9mIHRoZSBUYXJnZXQgRG9jdW1lbnQsIGl0IGNvbnRhaW5zIHhpOmhpZGRlbi4nLA0KICAgICd1c2VkIHRvIGNvbnRhaW4gWEJSTCBmYWN0cyB0aGF0IGFyZSBub3QgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBicm93c2VyJywNCiAgICAnZWxlbWVudCBkZW5vdGVzIGFuIFhCUkwgbnVtZXJpYyBpdGVtIHdoaWNoIGlzIGFuIGVsZW1lbnQgd2hpY2ggaXMgbm90IG9mIHR5cGUsIG5vciBkZXJpdmVkIGZyb20gdHlwZSwgZnJhY3Rpb25JdGVtVHlwZS4nLA0KICAgICdlbGVtZW50IGRlbm90ZXMgYW4gWEJSTCBub24tbnVtZXJpYyBpdGVtJywNCiAgICAnZGVub3RlcyBhbiBYQlJMIG51bWVyYXRvciBlbGVtZW50JywNCiAgICAndXNlZCB0byBjb250YWluIHJlZmVyZW5jZSBlbGVtZW50cyB3aGljaCBhcmUgcmVxdWlyZWQgYnkgYSBnaXZlbiBUYXJnZXQgRG9jdW1lbnQgKHNjaGVtYVJlZiwgbGluYmFzZVJlZiknLA0KICAgICd1c2VkIHRvIGRlZmluZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gWEJSTCBmYWN0cyBvciBiZXR3ZWVuIFhCUkwgZmFjdHMgYW5kIGZvb3Rub3RlIHJlc291cmNlcy4gVGhlIHR5cGUgb2YgcmVsYXRpb25zaGlwIGlzIGluZGljYXRlZCBieSB0aGUgdmFsdWUgb2YgdGhlIGFyY3JvbGUgYXR0cmlidXRlLCBzdWNoIGFzIGh0dHA6Ly93d3cueGJybC5vcmcvMjAwOS9hcmNyb2xlL2ZhY3QtZXhwbGFuYXRvcnlGYWN0IGZvciBmYWN0IHRvIGZhY3QgcmVsYXRpb25zaGlwcycsDQogICAgJ3VzZWQgdG8gY29udGFpbiByZXNvdXJjZSBlbGVtZW50cyB3aGljaCBhcmUgcmVxdWlyZWQgYnkgb25lIG9yIG1vcmUgVGFyZ2V0IERvY3VtZW50cyAoaXg6cmVsYXRpb25zaGlwLCBsaW5rOnJvbGVSZWYsIGxpbms6YXJjcm9sZVJlZiwgeGJybGk6Y29udGV4dCwgeGJybGk6dW5pdCknLA0KICAgICdkZW5vdGVzIGFuIFhCUkwgdHVwbGUnDQogICkNCikgJT4lIA0KICBrbml0cjo6a2FibGUoJ2h0bWwnKSAlPiUgDQogIGthYmxlRXh0cmE6OmthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpICU+JSANCiAga2FibGVFeHRyYTo6cm93X3NwZWMoMToxNCwgZXh0cmFfY3NzID0gImJvcmRlci1ib3R0b206IDFweCBzb2xpZCBsaWdodGdyYXkiKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICMlPiUgDQogICMgaHRtbHRvb2xzOjpkaXYoc3R5bGU9Im92ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyIpDQoNCmBgYA0KDQpUaGUgYmVzdCB3YXkgdG8gdW5kZXJzdGFuZCB3aGF0IGlubGluZSBYQlJMIGlzLCBpcyBhY3R1YWxseSB0byBzZWUgaXQsIGJlbG93IGFyZSB0aHJlZSBsaW5rcyB0byBvbmUgYW5kIHRoZSBzYW1lIGlubGluZSBYQlJMIGZpbGluZyBmb3IgYE1pY3Jvc29mdGAgZm9ybSBgMTAtUWAgZm9yIHRoZSA5IG1vbnRocyBlbmRlZCBgMjAyMS0wMy0zMWA6ICANCg0KKiBbVXN1YWwgRm9ybSB3aXRob3V0IGlubGluZSBYQlJMIFZpZXdlcl0oaHR0cHM6Ly93d3cuc2VjLmdvdi9BcmNoaXZlcy9lZGdhci9kYXRhLzc4OTAxOS8wMDAxNTY0NTkwMjEwMjA4OTEvbXNmdC0xMHFfMjAyMTAzMzEuaHRtKXt0YXJnZXQ9X2JsYW5rfSAgDQoqIFdpdGggdGhlIGFib3ZlIGxpbmsgb3BlbiwgcmlnaHQgY2xpY2sgYW55d2hlcmUgYW5kIHNlbGVjdCBgVmlldyBwYWdlIHNvdXJjZWAgKGlmIHVzaW5nIENocm9tZSksIHRoYXQgd2lsbCBzaG93IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGZvcm0sIG5vdCB0aGUgdXNlIG9mIHRoZSBhYm92ZSBlbGVtZW50cyBlbWJlZGRlZCBpbiB0aGUgeEhUTUwuICAgIA0KKiBbRm9ybSB2aWV3ZWQgdXNpbmcgRURHQVIgaW5saW5lIFhCUkwgdmlld2VyXShodHRwczovL3d3dy5zZWMuZ292L2l4P2RvYz0vQXJjaGl2ZXMvZWRnYXIvZGF0YS83ODkwMTkvMDAwMTU2NDU5MDIxMDIwODkxL21zZnQtMTBxXzIwMjEwMzMxLmh0bSl7dGFyZ2V0PV9ibGFua30gIA0KDQojIyMjIElubGluZSBYQlJMIFRyYW5zZm9ybWF0aW9ucyAgDQpJbmxpbmUgWEJSTCBpcyBlbWJlZGRlZCBpbiBhIGh1bWFuIHJlYWRhYmxlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0IHRoZSB2YWx1ZXMgYXJlIGFsc28gaW5jbHVkZWQgaW4gdGhlIHRoZSBkb2N1bWVudCBpbiBodW1hbiByZWFkYWJsZSBmb3JtIHRoYXQgbWlnaHQgbm90IGNvbXBseSB3aXRoIHRoZSBkYXRhIHR5cGVzIGZvcm1hdHMgcmVxdWlyZWQgYnkgWEJSTCBzcGVjaWZpY2F0aW9ucywgWEJSTCB0cmFuc2Zvcm1hdGlvbnMgZGVhbHMgd2l0aCB0aGlzIHByb2JsZW0gYnkgYXNzb2NpYXRpbmcgdGhlIGh1bWFuIHJlYWRhYmxlIHZhbHVlcyB3aXRoIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHRyYW5zbGF0ZWQgdG8gYSBtYWNoaW5lIHJlYWRhYmxlIHZhbHVlLCB0aGlzIGlzIGRvbmUgdXNpbmcgdGhlIGBAZm9ybWF0YCBhdHRyaWJ1dGUgZm9yIGVhY2ggWEJSTCBmYWN0IGluIGFuIGlubGluZSBYQlJMIGRvY3VtZW50LiANCg0KRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBkYXRlIHZhbHVlIG9mIGBNYXIuIDMxLCAyMDIxYCwgdGhpcyBkYXRlIGlzIGh1bWFuIHJlYWRhYmxlIGJ1dCBkb2VzIG5vdCBjb21wbHkgd2l0aCBYQlJMIHJlcXVpcmVkIGZvcm1hdCBmb3IgZGF0ZSBgSVNPIDg2MDFgIChZWVktTU0tREQpLCBzbyBhbiBgQGZvcm1hdD1peHQ6ZGF0ZW1vbnRoZGF5eWVhcmVuYCBpcyBhZGQgdG8gdGhlIGZhY3QgYW5kIHRoZW4gWEJSTCBwcm9jZXNzb3Igd2lsbCBrbm93IGhvdyB0byB0cmFuc2xhdGUgdGhpcyBkYXRlIHRvIHRoZSBgSVNPIDg2MDFgIGZvcm1hdC4gQmVsb3cgaXMgdGhlIGFib3ZlIGV4YW1wbGUgcHJvY2Vzc2VkIGJ5IGBBcmVsbGUgVHJhbnNmb3JtYXRpb24gVGVzdGVyIHBsdWdpbmA6ICANCg0KPGRpdj4NCjxjZW50ZXI+DQohW0lubGluZSBYQlJMIFRyYW5zZm9ybWF0aW9uc10oYHIgaGVyZTo6aGVyZSgnZG9jcycsICdpbWFnZXMvYXJlbGxlVHJhbnNmb3JtLnBuZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqSW5saW5lIFhCUkwgVHJhbnNmb3JtYXRpb25zKioNCjwvcD4NCjwvZGl2PiAgDQoNCioqVHJhbnNmb3JtYXRpb25zIFJlZ2lzdHJpZXMqKiAgDQpbVGhlIFhCUkwgVHJhbnNmb3JtYXRpb24gUmVnaXN0cnldKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1pbmxpbmUteGJybC5odG1sKSBjb250YWlucyB0aGUgcnVsZXMgYW5kIG1ldHJpY3MgYnkgd2hpY2ggdHJhbnNmb3JtYXRpb25zIGluIElubGluZSBYQlJMIGFyZSBwZXJmb3JtZWQuIFRoZXNlIHJ1bGVzIGRlc2NyaWJlIGhvdyBkZXNjcmlwdGl2ZSB0ZXh0IGluIElubGluZSBYQlJMIGRvY3VtZW50cyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgWEJSTCBkYXRhIHR5cGVzLiAgDQoNCkZvbGxvd2luZyBpcyBhIHNhbXBsZSBvZiB0cmFuc2Zvcm1hdGlvbnMgZnJvbSBbdHJhbnNmb3JtYXRpb24gcmVnaXN0cnkgMl0oaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi9pbmxpbmVYQlJMLXRyYW5zZm9ybWF0aW9uUmVnaXN0cnkvUkVDLTIwMTEtMDctMzErZXJyYXRhLTIwMTktMDQtMTcvaW5saW5lWEJSTC10cmFuc2Zvcm1hdGlvblJlZ2lzdHJ5LVJFQy0yMDExLTA3LTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxOS0wNC0xNy5odG1sKTogIA0KYGBge3IgdHJhbnNfcmVnLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KaHRtbHRhYjo6aHRtbHRhYignaHR0cHM6Ly93d3cueGJybC5vcmcvU3BlY2lmaWNhdGlvbi9pbmxpbmVYQlJMLXRyYW5zZm9ybWF0aW9uUmVnaXN0cnkvUkVDLTIwMTEtMDctMzErZXJyYXRhLTIwMTktMDQtMTcvaW5saW5lWEJSTC10cmFuc2Zvcm1hdGlvblJlZ2lzdHJ5LVJFQy0yMDExLTA3LTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxOS0wNC0xNy5odG1sJywgd2hpY2ggPSAnLy8qW0BpZD0iZXgtdHJhbnNmb3JtYXRpb25zIl0vL3RhYmxlJylbMTo1LCAxOjJdICU+JSANCiAgICBrbml0cjo6a2FibGUoJ2h0bWwnLHJvdy5uYW1lcyA9IEZBTFNFKSAlPiUga2FibGVFeHRyYTo6a2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKSAlPiUgDQogIGh0bWx0b29sczo6SFRNTCgpICU+JSANCiAgaHRtbHRvb2xzOjpkaXYoc3R5bGU9Im92ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyIpDQoNCmBgYA0KDQojIyMgU3R5bGUgR3VpZGVzICANClN0eWxlIGd1aWRlcyBhcmUgb25lIG9mIHRoZSBzdXBwb3J0aW5nIGRvY3VtZW50cyB0aGF0IGFjY29tcGFueSBhbiBYQlJMIFRheG9ub215LiBTdHlsZSBndWlkZXMgaGVscHMJaW4JYWNoaWV2aW5nCWNvbnNpc3RlbmN5CXdoaWxlCWNyZWF0aW5nLAltYWludGFpbmluZwlvcglleHRlbmRpbmcgdGhlCXRheG9ub215LiAgDQoNClN0eWxlIGd1aWRlcyBzZXQgdGhlIHJ1bGVzIGZvciBjb25zaXN0ZW50IGxhbmd1YWdlIGFuZCBuYW1pbmcgY29udmVudGlvbnMsIHN0eWxlcyBhbmQgb3JnYW5pemF0aW9uLiBGb3IgZXhhbXBsZSBhIHN0eWxlIGdpdWRlIHJ1bGUgbXkgc2V0IHRoZSB3aGV0aGVyIHRvIHVzZSBjYW1lbCBjYXNlIG9yIHBhc2NhbCBjYXNlLCB3aGF0IGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgb3IgZGlzYWxsb3dlZCBpbiBsYWJlbHMsIGFuZCBzbyBvbi4gICANCg0KKipFeGFtcGxlcyBvZiBzdHlsZSBndWlkZXM6KiogIA0KDQoqIFsqKklGUlMgVGF4b25vbXkgU3R5bGUgR3VpZGUqKiBfKFRoZSBJRlJTIFRheG9ub215IEFyY2hpdGVjdHVyZSAtIEFwcGVuZGl4IEEgLSBwYWdlIDMzKV9dKGh0dHBzOi8vd3d3LmlmcnMub3JnL2NvbnRlbnQvZGFtL2lmcnMvc3RhbmRhcmRzL3RheG9ub215L2dlbmVyYWwtcmVzb3VyY2VzL2lmcnMtdGF4b25vbXktYXJjaGl0ZWN0dXJlL2lmcnMtdGF4b25vbXktYXJjaGl0ZWN0dXJlLTIwMjAucGRmKXt0YXJnZXQ9X2JsYW5rfSAgDQoNCiogWyoqWEJSTCBVUyBTdHlsZSBHdWlkZSoqXShodHRwczovL3hicmwudXMvd3AtY29udGVudC91cGxvYWRzLzIwMTcvMDkvc3R5bGUtZ3VpZGUtMjAxNzA5MDcucGRmKXt0YXJnZXQ9X2JsYW5rfQ0KDQoNCiMjIyBUaHJlZSBUYXhvbm9taWVzICANCkluIHRoaXMgRmluYWwgc2VjdGlvbiB3ZSBsb29rIGF0IHRocmVlIGRpZmZlcmVudCB0YXhvbm9taWVzIGFuZCBoYXZlIG92ZXJ2aWV3IG9uIHRoZSBjaG9pY2VzIHRoZSB0YXhvbm9teSBhdXRob3JzIG1hZGUsIHRoZXJlIHRocmVlIHRheG9ub21pZXMgYXJlOiAgDQoNCiogKipJRlJTIFRheG9ub215ICgyMDIwKSoqDQoqICoqVVMgR0FBUCBUYXhvbm9teSAoMjAyMSkqKiAgDQoqICoqRXVyb3BlYW4gQmFua2luZyBBdXRob3JpdHkgKEVCQSkgVGF4b25vbXkgKEZyYW1ld29yayAzLjEpKiogIA0KDQpgYGB7ciB0aHJlZV90YXhvbm9teV90YWJsZSwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9ICANCg0KdGl0bGVzIDwtIGMoDQogICcnLA0KICAnSUZSUyBUYXhvbm9teSAoMjAyMCknLA0KICAnVVMgR0FBUCBUYXhvbm9teSAoMjAyMSknLA0KICAnRUJBIFRheG9ub215IChGcmFtZXdvcmsgMy4xKScNCikNCg0KbCA8LSBsaXN0KA0KICBjKA0KICAgIGAxYD0nTGluaycsDQogICAgYDJgPWh0bWx0b29sczo6YSgnSUZSUyBUYXhvbm9teSBSZXNvdXJjZXMnLCBocmVmPSdodHRwczovL3d3dy5pZnJzLm9yZy9pc3N1ZWQtc3RhbmRhcmRzL2lmcnMtdGF4b25vbXkvI2dlbmVyYWwtcmVzb3VyY2VzJywgdGFyZ2V0PSdfYmxhbmsnKSAlPiUgYXMuY2hhcmFjdGVyKCksDQogICAgYDNgPWh0bWx0b29sczo6YSgnRkFTQiAyMDIxIFRheG9ub215JywgaHJlZj0naHR0cHM6Ly93d3cuZmFzYi5vcmcvanNwL0ZBU0IvUGFnZS9TZWN0aW9uUGFnZSZjaWQ9MTE3NjE3NTcyMTYyOCcsIHRhcmdldD0nX2JsYW5rJykgJT4lIGFzLmNoYXJhY3RlcigpLA0KICAgIGA0YD1odG1sdG9vbHM6OmEoJ0VCQSBSZXBvcnRpbmcgRnJhbWUgMy4xJywgaHJlZj0naHR0cHM6Ly93d3cuZWJhLmV1cm9wYS5ldS9yaXNrLWFuYWx5c2lzLWFuZC1kYXRhL3JlcG9ydGluZy1mcmFtZXdvcmtzL3JlcG9ydGluZy1mcmFtZXdvcmstMy4xJywgdGFyZ2V0PSdfYmxhbmsnKSAlPiUgYXMuY2hhcmFjdGVyKCkNCiAgKSwNCiAgYygNCiAgICBgMWA9J0Rlc2lnbiBBcHByb2FjaCcsDQogICAgYDJgPSc8Yj5TdGFuZGFyZCBCYXNlZCBBcHByb2FjaDo8L2I+IEZvciBlYWNoIElGUlMgU3RhbmRhcmQsIGVsZW1lbnRzIHJlZmxlY3RpbmcgZGlzY2xvc3VyZSByZXF1aXJlbWVudHMgYXJlIGlkZW50aWZpZWQgYW5kIG1vZGVsZWQgYW5kIG9yZ2FuaXplZCBpbnRvIGEgdGF4b25vbXknLA0KICAgIGAzYD0nPGI+RG9tYWluIE1vZGVsOjwvYj4gUGFydGl0aW9ucyBidXNpbmVzcyBjb25jZXB0cyBzbyB0byBtZWV0IFVTIEdBQVAgRmluYW5jaWFsIFJlcG9ydGluZyBUYXhvbm9teSAoIlVHVCIpIFJlcXVpcmVtZW50cyB0aGF0IGRlZmluZWQgdGhlIGNvbnRlbnQgc2NvcGUsIHN0YWtlaG9sZGVycywgdXNlcnMsIHVzZXIgZ29hbHMsIHVzZSBjYXNlcyBmdW5jdGlvbmFsIHJlcXVpcm1lbnRzLCB0ZWNobmljYWwgcmVxdWlybWVudHMgYW5kIGRlc2lnbiBnb2Fscy4nLA0KICAgIGA0YD0nPGI+RGF0YSBQb2ludCBNb2RlbCAoRFBNKTo8L2I+IERQTSBpcyBhIHN0cnVjdHVyZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEsIGlkZW50aWZ5aW5nIGFsbCB0aGUgYnVzaW5lc3MgY29uY2VwdHMgYW5kIGl0cyByZWxhdGlvbnMsIGFzIHdlbGwgYXMgdmFsaWRhdGlvbiBydWxlcy4gSXQgY29udGFpbnMgYWxsIHRoZSByZWxldmFudCB0ZWNobmljYWwgc3BlY2lmaWNhdGlvbnMgbmVjZXNzYXJ5IGZvciBkZXZlbG9waW5nIGFuIElUIHJlcG9ydGluZyBzb2x1dGlvbi4gVGhlIFhCUkwgVGF4b25vbWllcyBwcmVzZW50cyB0aGUgZGF0YSBpdGVtcywgYnVzaW5lc3MgY29uY2VwdHMsIHJlbGF0aW9ucyBhbmQgdmFsaWRhdGlvbiBydWxlcyBkZXNjcmliZWQgYnkgdGhlIERQTSBpbiB0aGUgdGVjaG5pY2FsIGZvcm1hdCBvZiBhbiBYQlJMIHRheG9ub215LicNCiAgKSwNCiAgYygNCiAgICBgMWA9ICdUeXBlIG9mIHJlcG9ydGluZycsDQogICAgYDJgPSAnR0FBUCBSZXBvcnRpbmcnLA0KICAgIGAzYD0gJ0dBQVAgUmVwb3J0aW5nJywNCiAgICBgNGA9ICdSZWd1bGF0b3J5IFJlcG9ydGluZycNCiAgKSwNCiAgYygNCiAgICBgMWA9ICdFeHRlbnNpYmlsaXR5JywNCiAgICBgMmA9ICc8Yj5VbnJlc3RyaWN0ZWQJZXh0ZW5zaW9uczo8L2I+IFRoZSBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgYSBmcmFtZXdvcmssIGdlbmVyYWwgcHJpbmNpcGxlcyBhcmUgc2V0IG91dCBhbmQgaXQgaXMgbGVmdCB0byB1c2VycyB0byBkZXRlcm1pbmUgc3BlY2lmaWMgZXh0ZW5zaW9ucyBhcHBseWluZyB0byB0aGVpciBjYXNlJywNCiAgICBgM2A9ICc8Yj5SZXN0cmljdGVkL0xpbWl0ZWQgZXh0ZW5zaW9uczo8L2I+IEV4dGVuc2lvbiBpcyBhbGxvd2VkIHdpdGggc3RyaWN0IHNldCBvZiBydWxlcycsDQogICAgYDRgPSAnPGI+TGltaXRlZCBleHRlbnNpb25zOjwvYj4gRXh0ZW5zaW9uIGlzIGxpbWl0ZWQgdG8gbGFiZWxzIGluIHNwZWNpZmljIGxhbmd1YWdlIG9yIGludHJvZHVjaW5nIHNwZWNpZmljIGFzc2VydGlvbnMsIHRoZSBjb21wbGV0ZSBzZXQgb2YgZGF0YSBwb2ludHMgaXMgZGVmaW5lZCBpbiBiYXNlIHRheG9ub215Jw0KICApDQogIA0KKSAlPiUgYmluZF9yb3dzKCkNCg0KICBrbml0cjo6a2FibGUobCwgZm9ybWF0ID0gJ2h0bWwnLCBjb2wubmFtZXMgPSB0aXRsZXMsIGVzY2FwZSA9IEYpICU+JSANCiAga2FibGVFeHRyYTo6a2FibGVfY2xhc3NpYygpICU+JSANCiAga2FibGVFeHRyYTo6cm93X3NwZWMoMTo0LCBleHRyYV9jc3MgPSAiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGxpZ2h0Z3JheSIpDQoNCiAgDQoNCg0KYGBgDQoNCiMgVGF4b25vbXkgRGV2ZWxvcG1lbnQgUHJvamVjdCAgDQpJbiB0aGlzIHNlY3Rpb24gd2UgZXhwbG9yZSB0YXhvbm9teSBkZXZlbG9wbWVudCBwcm9qZWN0cyBiYXNlZCBvbiB0aGUgWEJSTCBVUyBleHBlcmllbmNlIGxhaWQgb3V0IGluIFRESCBzdGFydGluZyBzZWN0aW9uIDQgcGFnZSA1OS4gDQoNClRESCBicmVha3MgZG93biB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpbnRvIDYgbWFpbiBjb21wb25lbnRzOiAgDQoNCiogQXNzZXNzaW5nIG92ZXIgYWxsIHByb2plY3Qgc2NvcGUgKGFuZCBkZWZpbmluZyBnb2FscykgIA0KKiBCdWlsZGluZyBUcmFuc3BvcnQgRGF0YSBNb2RlbCAgDQoqIFZhbGlkYXRpb24gDQoqIFRoZSBNZWNoYW5pY3Mgb2YgVGF4b25vbXkgRGV2ZWxvcG1lbnQNCiogRG9jdW1lbnRpbmcgYSBUYXhvbm9teSAgDQoqIFRheG9ub215IEdvdmVybmFuY2UgIA0KDQo8ZGl2Pg0KPGNlbnRlcj4NCiFbVGF4b25vbXkgRGV2ZWxvcG1lbnRdKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL1RheERldkZXLnBuZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqVGF4b25vbXkgRGV2ZWxvcG1lbnQqKg0KPC9wPg0KPC9kaXY+IA0KDQojIyBBc3Nlc3MgU2NvcGUgYW5kIERlZmluZSBHb2Fscw0KVGhlIGdvYWwgb2YgWEJSTCB0YXhvbm9teSBpcyB0byBmYWNpbGl0YXRlIHRoZSBzdHJ1Y3R1cmVkIHJlcG9ydGluZyBvZiBkYXRhIGZyb20gcHJlcGFyZXIgdG8gY29uc3VtZXIuIFByb2plY3Qgc2NvcGUgYW5kIGdvYWxzIHNob3VsZCBjb25zaWRlciBmYWN0b3JzIHRoYXQgZW5hYmxlcyBwcmVwYXJlcnMgdG8gcHJvZHVjZSB0aGUgZGF0YSBhbmQgY29uc3VtZXIgc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSBkYXRhIGZvciBpdHMgaW50ZW5kZWQgcHVycG9zZS4gIA0KDQpgRnVuY3Rpb25hbCByZXF1aXJlbWVudHNgIHJlcHJlc2VudHMgd2hhdCBhIHRheG9ub215IGlzIG1lYW50IHRvIGRvLCB3aGlsZSBgTm9uLWZ1bmN0aW9uYWxgIHJlcXVpcmVtZW50cyBpbXBvc2VzIGNvbnN0cmFpbnRzIG9uIHN5c3RlbSBkZXNpZ24uIFRoZSBtYWluIGZvY3VzIGluIHRoaXMgc3RhZ2UgaXMgdG8gaWRlbnRpZnkgdGhlIGVmZmVjdCBvZiByZXF1aXJlbWVudHMgKGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsIHJlcXVpcmVtZW50cykgb24gdGhlIHNjb3BlIGFuZCBkZXNpZ24gZ29hbHMuICANCg0KKipGYWN0b3JzIHRvIGNvbnNpZGVyIHdoZW4gc2NvcGluZyBhbmQgZGVmaW5pbmcgZ29hbHM6KioNCg0KKiBQb2xpY3kgZGVjaXNpb24sIHN1Y2ggYXMgZXh0ZW5zaWJpbGl0eS4gIA0KKiBGdW5jdGlvbmFsIHJlcXVpcmVtZW50cyB2cyBOb24tZnVuY3Rpb25hbCByZXF1aXJlbWVudCAgDQoqIFVuZGVyc3RhbmQgdXNlIGNhc2VzLCBob3cgdXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGUgc3lzdGVtcyB0byBhY2hpZXZlIHRoZWlyIGdvYWxzLiAgDQoqIElkZW50aWZ5IGRhdGEgdG8gYmUgdHJhbnNwb3J0ZWQsIGFuZCBzeXN0ZW1zIHRoYXQgcHJvZHVjZSBhbmQgY29uc3VtZSB0aGUgZGF0YS4gIA0KKiBTdGFrZWhvbGRlcnMuICANCiogU2NvcGUgb2YgdGhlIHRheG9ub215IChpbmR1c3RyeS9zZWN0b3Igd2lkZSBvciBsaW1pdGVkIGltcGxlbWVudGF0aW9uKS4gIA0KKiBSZXNvdXJjZXMgcmVxdWlyZWQgZm9yIHRoZSBwcm9qZWN0Lg0KKiBTdXBwb3J0LCBtYWludGVuYW5jZSByZXF1aXJlbWVudHMgYW5kIGNoYW5nZSBtYW5hZ2VtZW50DQoqIERvY3VtZW50YXRpb24gYW5kIGNvbW11bmljYXRpb24NCiogQmFsYW5jaW5nIGFuZCBwcmlvcml0aXppbmcgcmVxdWlyZW1lbnRzIGZyb20gc3Rha2Vob2xkZXJzIGFuZCBjb25zaWRlcmluZyBjb3N0LWJlbmVmaXRzLg0KKiBNZWFzdXJlcyBmb3Igc3VjY2Vzcywgc3VjaCBhcyBhY2N1cmFjeSBhbmQgdGltZWxpbmVzcyBvZiBkYXRhLiANCg0KIyMgQnVpbGRpbmcgVHJhbnNwb3J0IE1vZGVsICANClRvIGJ1aWxkIHRoZSB0YXhvbm9teSAoVHJhbnNwb3J0IG1vZGVsKSwgY3VycmVudCBkYXRhc2V0cyBhbmQgZGltZW5zaW9uYWxpdHkgc2hvdWxkIGJlIGRlc2NyaWJlZC4gQWdhaW4gZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgYW5kIG5vbi1mdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzaG91bGQgYmUgbWFwcGVkIHRvIHRoZSBkYXRhLg0KDQpEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgdGhlIG1vZGVsLCBgbWluaW11bSBkYXRhc2V0YCBzaG91bGQgYmUgZGV0ZXJtaW5lZCwgYG1pbnVtdW0gZGF0YXNldGAgaXMgdGhlIGRhdGFzZXQgZnJlZSBvZiByZWR1bmRhbnQgb3IgZXh0cmFuZW91cyBpbmZvcm1hdGlvbiB3aGlsZSByZXByZXNlbnRpbmcgYWxsIHRoZSBuZWNlc3NhcnkgZGF0YS4gQ3VycmVudCBhbmQgbGVnYWN5IHN5c3RlbSBtYXkgYmUgYSBnb29kIHNvdXJjZSBmb3IgZGV0ZXJtaW5pbmcgbWluaW11bSBkYXRhc2V0KHMpLiANCg0KRGF0YSBpcyBtb2RlbGVkIGJhc2VkIG9uIG8gdGhlIG1pbmltdW0gZGF0YXNldCwgcmVkdW5kYW50IGFuZCByZXBldGl0aXZlIGluZm9ybWF0aW9uIHNob3VsZCByZWR1Y2VkIHRvIG1pbmltdW0sIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZm9yIGEgZGF0YSBwb2ludCBhbmQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRhdGEgcG9pbnRzIGFyZSBleHBsb3JlZC4gIA0KDQpBIGRhdGEgbW9kZWwgaXMgdHJhbnNmb3JtZWQgdG8gYSB0cmFuc3BvcnQgbW9kZWwgKFhCUkwgVGF4b25vbXkpLCBkdXJpbmcgdGhpcyBwcm9jZXNzIGRhdGEgdHlwZXMgYXJlIGRldGVybWluZWQsIGNvcmUgY29uY2VwdCBkaW1lbnNpb25zIGRlZmluZWQsIGNob2ljZXMgbGlrZSB1c2luZyBleHBsaWNpdCB2cyB0eXBlZCBkaW1lbnNpb25zIGFyZSBtYWRlLCBtb2RlbCByZWxhdGlvbnNoaXBzIGFyZSB0cmFuc2xhdGVkIHRvIFhCUkwgbGlua2Jhc2VzLiAgDQoNCkV4dGVuc2liaWxpdHkgZGVjaXNpb24gc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgdGF4b25vbXkgZGVzaWduIGFuZCBpbiBkZXRlcm1pbmluZyBhbGxvd2FibGUgbWV0aG9kcyB0aGF0IHVzZXJzIGNhbiBleHRlbmQgYSB0YXhvbm9teSwgYW5kIGhvdyBleHRlbnNpYmlsaXR5IGFmZmVjdHMgQ29tcGFyYWJpbGl0eS4gIA0KDQpPdGhlciBjb25zaWRlcmF0aW9ucyBpbmNsdWRlLCByZXBvcnRpbmcgc3lzdGVtIChzeXN0ZW0gcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIHJlcG9ydHMpLCB0cmFuc3BvcnQgZm9ybWF0LiAgDQoNCiMjIFZhbGlkYXRpb24gDQpWYWxpZGF0aW9uIGVuc3VyZSByb2J1c3QgYW5kIGFjY3VyYXRlIGRhdGEuIFRoZXJlIGFyZSB0d28gbGV2ZWxzIG9mIHZhbGlkYXRpb24gaW4gWEJSTDogIA0KDQoqIEJhc2ljIFZhbGlkYXRpb246IEVuc3VyZXMgcmVwb3J0cyBhcmUgc3ludGF4IHZhbGlkLCB2YWxpZCBkYXRhIHR5cGVzIHVzZWQgYW5kIHZhbGlkIHJlbGF0aW9uc2hpcHMgdXNlZC4gDQoqIFJlZ3VsYXRvcnkvSW5kdXN0cnkgUmVxdWlyZW1lbnRzOiBFbnN1cmVzIHRoYXQgYnVzaW5lc3MgcnVsZXMgYXJlIGFwcGxpZWQsIG1ldGhvZHMgdXNlZCBpbmNsdWRlIHNvZnR3YXJlIHZhbGlkYXRpb24sIFhCUkwgRm9ybXVsYSBWYWxpZGF0aW9uLCBYVUxFIHZhbGlkYXRpb24gYW5kIERhdGEgUXVhbGl0eSBDb21taXR0ZWVzIChpc3N1ZXMgYW5kIG1haW50YWluIGRhdGEgcXVhbGl0eSBydWxlcykuICANCg0KW1NlZSBYQlJMIFZhbGlkYXRpb25dKCN4YnJsLXZhbGlkYXRpb24pLiAgDQoNCg0KIyMgVGhlIE1lY2hhbmljcyBvZiBUYXhvbm9teSBEZXZlbG9wbWVudCAgDQpfV29ya2Zsb3dfICANCk11bHRpcGxlIGdyb3VwcyBwZXJmb3JtaW5nIGRpZmZlcmVudCB0YXNrcyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSBhIHRheG9ub215LCBhbmQgd29ya2Zsb3cgc2hvdWxkIGJlIG9yZ2FuaXplZCwgVERIIGdpdmVzIGV4YW1wbGVzIG9mIHRoZSBncm91cHMgYXMgZm9sbG93czogIA0KDQoqIEdyb3VwIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBkYXRhIG1vZGVsIGFuZCB0cmFuc2Zvcm1pbmcgaXQgdG8gdGF4b25vbXkuICANCiogR3JvdXAgcmVzcG9uc2libGUgZm9yIG92ZXJzZWVpbmcgaW5jb3Jwb3JhdGlvbiBvZiByZWd1bGF0b3J5L2dvdmVybmFuY2UgcnVsZXMgYW5kIGNoYW5nZXMuICANCiogR3JvdXAgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcgcmV2aWV3ZXJzJyBjb21tZW50cyBhbmQgbWFraW5nIHJlY29tbWVuZGF0aW9ucyBmb3IgbW9kaWZpY2F0aW9ucy4gIA0KDQpUaGUgd29yayBmbG93IG1pZ2h0IGxvb2sgYXMgZm9sbG93czogIA0KDQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtUYXhvbm9teSBEZXYgV29ya2Zsb3ddKGByIGhlcmU6OmhlcmUoJ2RvY3MnLCAnaW1hZ2VzL3dvcmtmbG93LmpwZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqVGF4b25vbXkgRGV2IFdvcmtmbG93KioNCjwvcD4NCjwvZGl2PiANCg0KX1ByZXBhcmluZyBhbmQgR2VuZXJhdGluZyB0aGUgVGF4b25vbXlfICANCkRldGVybWluZSB0aGUgc29mdHdhcmUgdG8gYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgdGF4b25vbXksIGFuZCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6ICANCg0KKiBEZXRlcm1pbmUgY29uY2VwdHMnIGxhYmVsczogaW1wb3J0YW50IGZvciBodW1hbiByZWFkYWJpbGl0eSBhbmQgdW5kZXJzdGFuZGluZyB0YXhvbm9teS4gIA0KKiBCdWlsZGluZyBhIHRheG9ub215IHNwcmVhZHNoZWV0OiBzcHJlYWRzaGVldCBjb250YWluaW5nIGNvbmNlcHQsIHJlbGF0aW9ucywgYW5kIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXhvbm9teSwgc29tZSBzb2Z0d2FyZSBwYWNrYWdlcyBjYW4gdXNlIHRoaXMgc3ByZWFkc2hlZXQgdG8gZ2VuZXJhdGUgdGF4b25vbXkgZmlsZXMuICANCg0KX1RoZSBJbXBvcnRhbmNlIG9mIFB1YmxpYyBFeHBvc3VyZV8gIA0KVGF4b25vbXkgc2hvdWxkIHVuZGVyZ28gc2lnbmlmaWNhbnQgcHVibGljIHJldmlldyAod2hlcmUgYW55b25lIGNhbiBzZWUgYW5kIGNvbW1lbnQgb24gdGhlIHRheG9ub215KSwgd29yZCAncHVibGljJyBoZXJlIGlzIHJlbGF0aXZlIHRvIHRoZSBzaXplIGFuZCBzY29wZSBvZiB0aGUgdGF4b25vbXksIGFuZCBmZWVkYmFjayBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGNvbGxlY3RlZCBhbmQgYW5hbHl6ZWQuICANCg0KDQojIyBEb2N1bWVudGluZyBhIFRheG9ub215ICANClRheG9ub215IGlzIGEgcG93ZXJmdWwgdG9vbCwgYW5kIGl0IGNhbiBvbmx5IGZ1bGZpbGwgaXRzIHB1cnBvc2UgaWYgdXNlcnMga25vdyBob3cgdG8gdXNlIGl0LiBUYXhvbm9teSBkb2N1bWVudGF0aW9uIGlzIGV4dHJlbWVseSBpbXBvcnRhbnQsIGl0IGNvbW11bmljYXRlcyB0aGUgZ29hbHMgb2YgdGhlIHRheG9ub215IGFuZCBtZWFucyB0byBhY2hpZXZlIHRob3NlIGdvYWxzIHRvIGFsbCBzdGFrZWhvbGRlcnMuICANCg0KRG9jdW1lbnRhdGlvbiBpbmNsdWRlOiAgDQoNCiogVGF4b25vbXkgV2hpdGUgUGFwZXI6IGNhbiBiZSBjb25zaWRlcmVkIGFzIGFuIGFubm91bmNlbWVudCBvZiB0aGUgdGF4b25vbXksIHdpdGggZXhwbGFuYXRpb24gb2YgaXRzIHB1cnBvc2UgYW5kIGp1c3RpZmljYXRpb24gZm9yIGl0cyBkZXZlbG9wbWVudC4gIA0KKiBUYXhvbm9teSBndWlkZTogZXhwbGFpbnMgdGhlIHRheG9ub215IGl0IHNlbGYgYW5kIGxvZ2ljIGJlaGluZCBpdC4gIA0KKiBSZXBhaXJlcidzIGd1aWRlOiBwcm92aWRlcyBwcmVwYXJlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGF4b25vbXkncyBjb25jZXB0cyBhbmQgc3RydWN0dXJlcyBhcyBuZWVkZWQgdG8gYnVpbGQgWEJSTCByZXBvcnRzLiAgDQoqIERhdGEgQ29uc3VtZXIgR3VpZGU6IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBjb21tb24gdXNlIGNhc2VzIGZvciBkYXRhIGNvbnN1bWVycy4gDQpUREggcHJvdmlkZSBkZXRhaWxlZCBleGFtcGxlcyBvZiBkb2N1bWVudGF0aW9uIGluIHNlY3Rpb24gOCBwYWdlIDExMS4gIA0KDQojIyBUYXhvbm9teSBHb3Zlcm5hbmNlICANClRoZSBUREggcmVjb2duaXplcyBmb3VyIGdvdmVybmFuY2Ugcm9sZXMgaW4gdGhlIHRheG9ub215IGRldmVsb3BtZW50IGxpZmUgY3ljbGUgd2hpY2ggc3BhbnMgb3ZlciBmb3VyIHBoYXNlcy4gIA0KDQpfR292ZXJuYW5jZSBSb2xlc186ICANCg0KKiBgU3BvbnNvcmA6IENoYW1waW9ucyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBhbmQgaXMgYWJsZSB0byBicmluZyB0b2dldGhlciBzdGFrZWhvbGRlcnMgc3VjY2Vzc2Z1bGx5LCBjb3VsZCBiZSBhIHJlZ3VsYXRvcnkgYWdlbmN5IG9yIHN0YW5kYXJkcyBvcmdhbml6YXRpb24uICANCiogYFdvcmtpbmcgR3JvdXBgOiBJbmNsdWRlcyByZXByZXNlbnRhdGlvbiBvZiBhbGwgc3Rha2Vob2xkZXJzIChyZWd1bGF0b3IsIHByZXBhcmVycywgZGV2ZWxvcGVycywgY29uc3VtZXJzLi4uKSwgdGhpcyBncm91cCBwZXJmb3JtIHRoZSB0YXNrcyB0byBkZXZlbG9wIHRoZSB0YXhvbm9teSBkZWxpdmVyYWJsZXMuICANCiogYFN0ZWVyaW5nIENvbW1pdHRlZWA6IGhpZ2hlc3QgY29tbWl0dGVlIGFuZCBpcyBsZWQgYnkgdGhlIHNwb25zb3IsIHByb3ZpZGVzIG92ZXJzaWdodCwgZXZhbHVhdGVzIG1ham9yIG1pbGVzdG9uZXMsIHJldmlld3MgYW5kIGFwcHJvdmVzIGRlbGl2ZXJhYmxlcywgYW5kIHNlcnZlcyBhcyAidGllIGJyZWFrZXIiIG9uIG1ham9yIGRlY2lzaW9ucyBjb25jZXJuaW5nIHRoZSB0YXhvbm9teS4gIA0KKiBgVGF4b25vbXkgTWFuYWdlcmA6IGlzIHRoZSBwcm9qZWN0IG1hbmFnZXIsIG1haW50YWlucyBkZXRhaWxlZCBrbm93bGVkZ2Ugb2YgdGhlIHRheG9ub215IGFuZCB0aGUgcHJvamVjdCBhcyBhIHdob2xlIGFuZCBwcm92aWRlcyBkYXktdG8tZGF5IHN0YWZmIHN1cHBvcnQgZm9yIHRoZSB0YXhvbm9teSB3b3JraW5nIGdyb3VwLiBBbHNvIGludGVyYWN0cyB3aXRoIGZlZWRiYWNrIGFuZCByZXZpZXdzIGFuZCBjb21tZW50cywgYW5kIHJlcG9ydHMgdG8gdGhlIHN0ZWVyaW5nIGNvbW1pdHRlZSBhbmQgd29ya2luZyBncm91cC4gIA0KKiBXb3JraW5nIGdyb3VwIGFuZCB0YXhvbm9teSBzdGVlcmluZyBjb21taXR0ZWUgY2FuIGJlIGNvbnNvbGlkYXRlZCBhbmQgc3RyZWFtbGluZWQgaW50byBhIGB0YXhvbm9teSBjb21taXR0ZWVgLiANCg0KVGhlIGludGVyYWN0aW9uIG9mIHRoZSBhYm92ZSByb2xlcyBjYW4gYmUgdmlld2VkIGFzIGZvbGxvd3M6ICANCg0KPGRpdj4NCjxjZW50ZXI+DQohW0dvdmVybmFuY2Ugc3RydWN0dXJlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9nb3YxLmpwZycpYCkNCjwvY2VudGVyPg0KPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCioqR292ZXJuYW5jZSBzdHJ1Y3R1cmUqKg0KPC9wPg0KPC9kaXY+IA0KDQpfVGF4b25vbXkgZGV2ZWxvcG1lbnQgTGlmZSBjeWNsZSBQaGFzZXNfOiAgDQpUaGUgVERIIHJlY29nbml6ZXMgZm91ciBwaGFzZXMgaW4gdGhlIHRoZSB0YXhvbm9teSBkZXZlbG9wbWVudCBsaWZlIGN5Y2xlLCB0aGUgZ29hbHMgYW5kIHJvbGVzIGZvciBlYWNoIHBoYXNlIGFyZSBhcyBmb2xsb3dzOiAgDQoNCjxkaXY+DQo8Y2VudGVyPg0KIVtUaGUgbGlmZWN5Y2xlIG9mIHRheG9ub215IGRldmVsb3BtZW50IGFuZCBnb3Zlcm5hbmNlXShgciBoZXJlOjpoZXJlKCdkb2NzJywgJ2ltYWdlcy9saWZlQ3ljbGUuanBnJylgKQ0KPC9jZW50ZXI+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KKipUaGUgbGlmZWN5Y2xlIG9mIHRheG9ub215IGRldmVsb3BtZW50IGFuZCBnb3Zlcm5hbmNlKioNCjwvcD4NCjwvZGl2Pg0KDQoNCg0KDQoNCg==